[Résolu] Problème de code ou tout à fait normal ?

Problème de code ou tout à fait normal ? [Résolu] - C - Programmation

Marsh Posté le 07-05-2012 à 23:10:19    

Problème réglé. Il suffit de mettre fin à la boucle pour que le printf s'affiche (changer EOF par '.' par exemple). Ce n'est pas expliqué dans le livre, et je trouve ça plutôt mal fichu. Je lis chaque ligne avec attention et ça m'aurait évité d'être bloqué.
EDIT: en fait ça fait partie d'un exercice de trouve comment tester ce programme. Je suis fier d'y être arrivé xD
 
Bonsoir à tous ! J'ai le livre "Le langage C Norme ANSI 2e édition" de K&R, version française.
 
Je débute dans le C, donc je ne sais pas si ce que j'ai sur mon écran est réellement ce que je devrais avoir.
Par exemple, à la fin du chapitre 1, on a ce code qui est censé compter les nombres de lignes, de caractères et de mots (ce n'est pas un exercice).

 

Code :
  1. # include <stdio.h>
  2. #define DEDANS 1
  3. #define DEHORS 0
  4. main()
  5. {
  6. int c, nl, nm, nc, etat;
  7. etat=DEHORS;
  8. nl = nm = nc =0;
  9. while((c=getchar()) != EOF) {
  10.  ++nc;
  11.  if (c == '\n')
  12.   ++nl;
  13.  else if (c == ' ' || c == '\n' || c == '\t')
  14.   etat = DEHORS;
  15.  else if (etat == DEHORS) {
  16.   etat=DEDANS;
  17.   ++nm;
  18.  }
  19.  printf("Il y a %d lignes, %d mots et %d caracteres\n\n", nl, nm, nc);
  20. }
  21. }



Avec ce code, est-ce normal que le printf s'affiche autant de fois qu'il y a de caractères ? Si j'écris une phrase, c'est vraiment le bordel dans la console.
Autre chose : est-ce normal qu'appuyer sur "ENTRER" compte comme un caractère ?
Pourquoi lorsque j'appuie sur un nombre la 1ère fois il me détecte un mot alors que les fois suivantes ça ne le fait pas ?
 
Voici une capture d'écran :

 
http://image.noelshack.com/fichiers/2012/19/1336424647-t.png
 

Je précise que je travail avec Visual Studio C++ Express 2010 sous Windows 7 64bits.
 
Je vous remercie d'avance pour votre aide ! :D


Message édité par churos45 le 08-05-2012 à 16:16:22
Reply

Marsh Posté le 07-05-2012 à 23:10:19   

Reply

Marsh Posté le 08-05-2012 à 15:27:55    

Après avoir bien regardé, le printf n'est même pas dans dans la boucle dans le livre :
 

Code :
  1. # include <stdio.h>
  2. #define DEDANS 1
  3. #define DEHORS 0
  4. main()
  5. {
  6. int c, nl, nm, nc, etat;
  7. etat=DEHORS;
  8. nl = nm = nc =0;
  9. while((c=getchar()) != EOF) {
  10.  ++nc;
  11.  if (c == '\n')
  12.   ++nl;
  13.  else if (c == ' ' || c == '\n' || c == '\t')
  14.   etat = DEHORS;
  15.  else if (etat == DEHORS) {
  16.   etat=DEDANS;
  17.   ++nm;
  18.  }
  19. }
  20.  printf("Il y a %d lignes, %d mots et %d caracteres\n\n", nl, nm, nc);
  21. }


 
Du coup c'est encore pire, rien ne s'affiche. Vous ne remarquez rien de bizarre avec ce code ? Cela peut-il venir du compilateur ?


Message édité par churos45 le 08-05-2012 à 15:29:08
Reply

Marsh Posté le 08-05-2012 à 17:17:50    

Tu es sur une fenêtre Windows ou Linux pour tester cela?
En Windows il faut faire Ctrl+Z sur une ligne vide pour envoyer un EOF et en linux, c'est probablement Ctrl+D
(En fait, dans une fenetre DOS, Ctrl+Z est compris comme une marque de fin de texte, le caractère et ce qui suit n'est pas pris en compte. Quand on fait Ctrl+Z (+ retour chariot bien sur) sur une ligne vide, cela envoie donc une chaine vide, qui est interprétée comme EOF [puisque logiquement, s'il restait qque chose, la chaîne ne serait pas vide mais contiendrait au moins un \n])
 
Une autre idée de traitement, pondue vite fait à partir de ton code (pas vérifié que ça marche dans tout les cas, c'est pour te donner une idée de comment on pourrait faire)

Code :
  1. # include <stdio.h>
  2. #define DEHORS 0
  3. #define DEDANS 1
  4. int main() {
  5.     int c, nl, nm, nc, ls, etat;
  6.     etat = DEHORS;
  7.     nl = nm = nc = ls = 0;
  8.     do {
  9.         switch (c = getchar()) {
  10.         case EOF:
  11.             if (ls) ++nl; /* EOF en fin de ligne non vide */
  12.             break;
  13.         case '\n':
  14.             etat = DEHORS;
  15.             ++nc; /* a mettre en commentaire si on ne veut pas les compter */
  16.             ++nl;
  17.             ls = 0;
  18.             break;
  19.         case ' ':
  20.         case '\t':
  21.             etat = DEHORS;
  22.             ++nc;
  23.             ++ls;
  24.             break;
  25.         default:
  26.             if (etat == DEHORS) {
  27.                 etat = DEDANS;
  28.                 ++nm;
  29.             }
  30.             ++nc;
  31.             ++ls;
  32.             break;
  33.         }
  34.     } while (c != EOF);
  35.     printf("Il y a %d lignes, %d mots et %d caracteres\n\n", nl, nm, nc);
  36.     return 0;
  37. }


 
A+,


Message édité par gilou le 08-05-2012 à 19:40:44

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed