[C, C++] Programme qui compte les caractères en entrée

Programme qui compte les caractères en entrée [C, C++] - C++ - Programmation

Marsh Posté le 01-04-2003 à 22:39:48    

Bonjour,
Je suis entrain de lire le livre de K&R sur le langage C. Jusqu'a maintenant il n'y avait rien d'exeptionnel, seulement je suis tombé sur ce code dans le livre :
 
 

Code :
  1. #include <stdio.h>
  2. /* compte les caractères en entrée ; première version */
  3. main()
  4. {
  5. long nc;
  6. nc = 0;
  7. while (getchar() != EOF)
  8.  ++nc;
  9. printf("%1d\n", nc);
  10. }

 
 
Quand je le compile et que je l'exécute, j'obtiens
 
$ ./chap1_caract3
test
programmation
 
$
 
J'arrête le programme direct avec control + c puisqu'il se passe rien ?  
 :??:  Pourquoi il n'affiche pas la fonction printf pour afficher le but du programme : le nb de caractères ? ça doit etre tout con (j'ai p-e mal recopié, mais pourtant je me suis relus...)


---------------
x,y,z
Reply

Marsh Posté le 01-04-2003 à 22:39:48   

Reply

Marsh Posté le 01-04-2003 à 22:57:38    

Tu n'as pas fait de EOF ... :D
 
Ctrl-C => tu kill le prog ... donc pas de printf ...
 
(c'est Ctrl-D la fin de fichier, non ?)
 
(Pas sur du tout, mais essaye ... ca coute pas gd chose ... ;))


---------------
last.fm
Reply

Marsh Posté le 01-04-2003 à 22:58:47    

sinon, tu peux lui passer un fichier en entrée ...
 
ou alors tu peux modifier le code pour qu'il te sorte le nb à la fin de la ligne ... (comparaison avec '\n' au lieu de EOF)


---------------
last.fm
Reply

Marsh Posté le 01-04-2003 à 23:06:05    

Tiens oui ça marche CTRL+D :) ça correspond à quoi ? enfin je trouve ça bizarre qu'on soit obligé d'avoir besoin de taper au clavier pour pouvoir continuer le programme "normalement", non ?
 
ou alors j'ai mal compris ce qu'était vraiment EOF :/


---------------
x,y,z
Reply

Marsh Posté le 02-04-2003 à 05:36:09    

ltu dois mal lire le K&R alors ou avoir la première édition. le type par défaut n'est pas int, il faut le préciser (pour main void ou int (pour faire plaisir à C99))

Reply

Marsh Posté le 02-04-2003 à 11:20:44    

Z-Axis a écrit :

Tiens oui ça marche CTRL+D :) ça correspond à quoi ? enfin je trouve ça bizarre qu'on soit obligé d'avoir besoin de taper au clavier pour pouvoir continuer le programme "normalement", non ?
 
ou alors j'ai mal compris ce qu'était vraiment EOF :/


 
EOF : End Of File ... Ton prog est fait pour recevoir un fichier en entrée .. Pas une saisie utilisateur, apparamment ...
 
Par défaut, si tu ne lui envoie pas de fichier, le flux stdin est l'entrée clavier. CTRL-D est un moyen d'envoyer un signal de fin de flux au programme ... rien de plus ...


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 11:21:27    

++Taz a écrit :

ltu dois mal lire le K&R alors ou avoir la première édition. le type par défaut n'est pas int, il faut le préciser (pour main void ou int (pour faire plaisir à C99))


:D Fais plaisir à Taz, ca coute rien ! :D


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 16:47:15    

J'y ai réfléchis et en fait c'est con c'est vrai. Corriger moi si je me trompe, mais en fait, la boucle while  :
 
 

Code :
  1. while (getchar() != EOF )
  2.         ++nc;
  3. printf("%1d\n", nc);

 
 
qui signifie donc littéralement :  
 
tant que [ce que l'on entre au clavier] est différent de [EOF]  
ajouter 1 à nc  
afficher nc  
 
Mais comme while (getchar() != EOF) est toujours vérifié, on ne passe jamais à printf ? C'est une boucle infinie non ?
 
 
Sinon Taz, c'est la seconde édition du bouquin page 17. C'est le code tel que je l'ai écrit. (mais c'est normal qu'il mette pas les voidmain ou je sais pas quoi vu que c'est le tout début du livre)


---------------
x,y,z
Reply

Marsh Posté le 02-04-2003 à 17:00:24    

Z-Axis a écrit :


(...)
 
qui signifie donc littéralement :  
 
tant que [ce que l'on entre au clavier] est différent de [EOF]  
ajouter 1 à nc  
afficher nc  
 
Mais comme while (getchar() != EOF) est toujours vérifié, on ne passe jamais à printf ? C'est une boucle infinie non ?
 


 
Bingo ! ;)
 
Sauf si tu lui passes un fichier, auquel cas, il te retournera la taille exacte du fichier à l'octet près !


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 17:20:08    

ben c du old style à proscrire

Reply

Marsh Posté le 02-04-2003 à 17:20:08   

Reply

Marsh Posté le 02-04-2003 à 17:22:03    

theShOcKwAvE a écrit :


 
Bingo ! ;)
 
Sauf si tu lui passes un fichier, auquel cas, il te retournera la taille exacte du fichier à l'octet près !


 
Bien alors !
Tu peux me dire comment "tu lui passes un fichier" ?  :??:  
Bah oui parce que chez moi, c'est un simple prompt le truc comme je l'ai dit dans mon premier post :
 
$ ./chap1_caract3
test
programmation
 
$  
 
 :??:


---------------
x,y,z
Reply

Marsh Posté le 02-04-2003 à 17:23:13    

++Taz a écrit :

ben c du old style à proscrire


 
J'y peux rien moi, mais les main void et tout ça arrive plus tard, c'est sans doute normal... je tiens à préciser que le chapitre s'intitule "Présentation générale du C" et que c'est le premier chapitre sur 8 !


---------------
x,y,z
Reply

Marsh Posté le 02-04-2003 à 17:24:17    

je veux juste que tu comprennes que le k&R est la référence, mais qu'il date, depuis de nouvelles normes compatibles ANSI sont sorties, etc

Reply

Marsh Posté le 02-04-2003 à 17:25:38    

Ca fait des plombes que j'ai pas refait de shell .... :D
 
ce serait pas un truc style
 
cat monFichier|monProg
 
 ???
 
Quelqu'un qui utilise Linux fréquemment devrait pouvoir te dire ca vite fait ...
 
Sous Dos, je ne sais pas si c'est possible ...


---------------
last.fm
Reply

Marsh Posté le 02-04-2003 à 17:29:41    

++Taz a écrit :

je veux juste que tu comprennes que le k&R est la référence, mais qu'il date, depuis de nouvelles normes compatibles ANSI sont sorties, etc


 
Oui sans doute, mais ça me donnera des bases quand même, ils ont quand même pas tout changés !?


---------------
x,y,z
Reply

Marsh Posté le 02-04-2003 à 18:31:29    

non loin de là. apr contre le type apr défaut n'est plus int, il faut préciser le type explicitement

Reply

Sujets relatifs:

Leave a Replay

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