Problème avec un programme C

Résolu
yadhus Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -  
yadhus Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
J'ai un exercice de programmation C qui ne veut pas fonctionner, je vous donne ci-dessous le code source que j'ai utilisé:



Exercice 5

Lire caractère par caractère une ligne entrée au clavier (la fin de ligne est caractérisée par un retour chariot) et la stocker dans un tableau.
Transformer cette ligne en remplaçant une suite d'espaces ou une tabulation par un espace unique, et en remplaçant le retour chariot de fin de ligne par le caractère nul ('\0').
Réécrire la ligne ainsi transformée par un printf () de chaîne de caractères.


#include <stdio.h>
#include <string.h>
int main ()
{
char ch[255];
int i,j,A;


printf ("Donner votre chaîne de caractère\n");
gets (ch);

A=strlen(ch);
for (i=1;i<A;i++)
{
if ((ch[i]=' ') && (ch[i+1]=' '))
{
for (j=i+1;j<A;j++) ch[j]=ch[j+1];
}
A--;
}

for (i=0;i<A;i++)
{
if (ch[i]='\t')
{
for (j=i;j<A;j++)
ch[j]=ch[j+1];
}
A--;
}
puts (ch);




return 0;
}

4 réponses

Mahmah Messages postés 496 Date d'inscription   Statut Membre Dernière intervention   125
 
Bonjour,

Je vois deux points par lesquels commencer:

1) gets ne répond pas exactement à l'énoncé (enfin moi je ne l'interpréterais pas comme ça) car gets lit la ligne puis tu transformes. Je ferais un getc pour lire caractère par caractère. Ainsi tu peux vérifier en live si tu as des doubles espaces et ne pas les insérer dans une chaîne que tu construit petit à petit.

2) if ( (ch[i]=' ' ) && ( ch[i+1]=' ' ) )

si ch "Bonjour", après cette ligne ch vaudra " njour"
Le test d'égalité en C/C++/Java est ==, un simple = est une affectation.

M.

EDIT.
Je n'ai pas vérifié ce point car il m'a apparu possible dans ton algo. Un tableau de 7 caractères va bien de l'indice 0 à 6.
0
yadhus Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   3
 
Merci beaucoup pour ton aide. J'ai enfin résolu cet exercice, bon si jamais ça t'intéresses voici le code source


#include <stdio.h>
#include <string.h>
int main ()
{
char ch[255];
int i,j,A,e;


printf ("Donner votre chaîne de caractère\n");
gets (ch);

A=strlen(ch);

for (i=0;i<A;i++)
{
if (e!=0) i--;
e=0;
if (ch[i]=='\t')
{
/*for (j=i;j<A;j++)
{
ch[j]=ch[j+1];
e++;
A--;
}*/
ch[i]=' ';
}
}

e=0;

for (i=0;i<A;i++)
{
if (e!=0) i--;
e=0;
if ((ch[i]==' ') && (ch[i+1]==' '))
{
for (j=i+1;j<A;j++) ch[j]=ch[j+1];
e++;
A--;
}
}

puts (ch);

return 0;
}
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
encore une possibilité
#include<stdio.h>

int lire(char *ch,int longueur);

int main ()
{
  char ch[255];

  while(lire(ch,255)>0){
    printf("%s\n",ch);
  }
  return 0;
}

int lire(char *ch,int longueur){
  int i,c;
  char d = 'a';
  for(i=0;i<longueur-1 && (c=getchar()) != EOF && c != '\n';){
    if(c == '\t')
      c = ' ';
    if(d!=' ')
      ch[i++] = c;
    if(d==' ' && c!=' ')
      ch[i++] = c;
    d=c;
  }
  ch[i]='\0';
  return i;
}

0
yadhus Messages postés 33 Date d'inscription   Statut Membre Dernière intervention   3
 
oui merci beaucoup, cette idée de travailler avec les pointeurs est beaucoup mieux;
Encore merci
0