Problème avec un programme C

Résolu
yadhus Messages postés 34 Statut Membre -  
yadhus Messages postés 34 Statut Membre -
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 497 Statut Membre 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 34 Statut Membre 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 21644 Statut Modérateur, Contributeur sécurité 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 34 Statut Membre 3
 
oui merci beaucoup, cette idée de travailler avec les pointeurs est beaucoup mieux;
Encore merci
0