Problème avec un programme C

Résolu/Fermé
yadhus Messages postés 33 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 16 mars 2009 - 17 févr. 2008 à 11:34
yadhus Messages postés 33 Date d'inscription dimanche 17 février 2008 Statut Membre Dernière intervention 16 mars 2009 - 17 févr. 2008 à 17:50
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 lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
17 févr. 2008 à 11:58
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 dimanche 17 février 2008 Statut Membre Dernière intervention 16 mars 2009 3
17 févr. 2008 à 12:27
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 jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
17 févr. 2008 à 13:24
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 dimanche 17 février 2008 Statut Membre Dernière intervention 16 mars 2009 3
17 févr. 2008 à 17:50
oui merci beaucoup, cette idée de travailler avec les pointeurs est beaucoup mieux;
Encore merci
0