[c] je ne comprend rien !

Fermé
Maxg59 Messages postés 275 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 7 octobre 2006 - 18 août 2005 à 23:43
Maxg59 Messages postés 275 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 7 octobre 2006 - 19 août 2005 à 02:12
Salut a tous !!!
allors voila je (re)débute en C, j'aivais posé une question sur ce forum il y a quelque tem, on m'avais donné une reponse mais comme je ne comprenais pas je me suis dit que le c etait un langage trop compliqué pour moi, la je m'y suis remi et je ne comprend toujours ps la réponse.
Pourriez-vous svp me traduire, en français le code suivant ???
#include<stdio.h> 
#include <stdlib.h>
main() 
{ 
  int c,espace; 
  espace = 0; 

  while((c=getchar())!=EOF) 
  { 
    if (c != ' ')
      espace = 0;
    if (c == ' ')
      espace++;  
    if (espace < 2)
      putchar(c); 
  } 
} 


je ne voi pas du tout ou il est question de changer le texte en entré ????
Au fait, le code sert a copier son entrée sur sa sortien en remplacent les chane d'espace par un seul espace.
D'avance Merci !!!
Max

2 réponses

ceddec Messages postés 148 Date d'inscription dimanche 31 juillet 2005 Statut Membre Dernière intervention 10 mars 2012 82
18 août 2005 à 23:56
Bonsoir,

d'aprés moi, tu lis avec getchar()
et quand ce n'est pas un deuxième (ou plus) espace consécutif, on affiche le caractère lu avec putchar.

Voila l'explication du script mais je ne suis pas sur

Bon Courage
0
Maxg59 Messages postés 275 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 7 octobre 2006 27
18 août 2005 à 23:58
Oui c'est vrai mais je ne comprend pas pourquoi , lorseque l'on met 3 estaces consécutifs il repond le même texte en sortie mais en remplacent les 3 espaces par 1 seul ?????????
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
19 août 2005 à 00:23
Salut Maxg59,

Je crois avoir compris.

Alors, voilà dis toi que la variable c est un entier.
Un caractère prend habituellement la place d'un octet.

Un octet c'est la taille d'une variable char. Une variable int possède le double je crois (avec gcc). Mais qu'un int possède plus de place ne change rien: il ne peux contenir qu'un caractère et non pas une chaîne de caractère.
Si tu veux stocker une chaine de caractère, il faut utiliser un tableau et non pas une simple variable. (Et changer le code).

getchar ne retourne qu'un seul caractère.
Alors imagine:
Tu tapes trois caractères, tant que pas arrivé à la fin de ce que tu as tapé (!=EOF), la boucle continuera.
Premier passage de la boucle: getchar récupère le premier espace
, avec la condition d'en dessous, il s'incrémente de 1.
Avec la condition du dessous, on voit qu'il est plus petit que 2 donc affichage de l'espace.
Second passage de la boucle:getchar récupère le deuxième espace, avec la condition d'en dessous, il s'incrémente de 1, donc espace est égal à 2, donc pas d'affichage avec la condition d'après. Et ainsi de suite: tant que getchar ne donnera pas autre chose qu'un espace à c, alors espace sera superieur à 2, donc pas d'affichage.

Le soucis c'est peut être que tu avais cru que getchar retournait une chaine, et non pas un seul caractère. Ca change tout.

Donc ici, si c est égal à autre chose qu'un espace, il ya aura affichage sans encombre, mais s'il y a un espace, il incrémentera la variable espace.
Il faut bien se dire que tu ecris ta ligne, tu appuies sur entrée, et getchar ne récupèrera qu'un seul caractère à la fois jusqu'à ce qu'il atteigne la fin. Donc il ya aura une itération de la boucle à chaque fois qu'un caractère est récupéré.
0
Maxg59 Messages postés 275 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 7 octobre 2006 27
19 août 2005 à 02:12
Miracle !!!
J'ai compri !!!!
Big merci !!!!
0