Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2987 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2141264
churos45
Posté le 07-05-2012 à 23:10:19  profilanswer
 

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
mood
Publicité
Posté le 07-05-2012 à 23:10:19  profilanswer
 

n°2141321
churos45
Posté le 08-05-2012 à 15:27:55  profilanswer
 

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
n°2141346
gilou
Modérateur
Modzilla
Posté le 08-05-2012 à 17:17:50  profilanswer
 

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é!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
PROBLEME MODULE DE RESERVATIONProblème avec PHPExcel
Problème requête HTTP[Divers] Conseil plateforme en ligne pour morceaux de code
Problème swf dans html (Compatibilité navigateurs et autres soucis)Problème de programation
Problème avec getGraphicsproblème dimensions SWF
Plus de sujets relatifs à : [Résolu] Problème de code ou tout à fait normal ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR