2010-09-05 5 views
4

Je m'enseigne C avec K & R et suis perplexe par un des exemples dans le livre. Je compile le code exactement comme il est écrit dans l'exemple mais il ne fait pas ce que disent les auteurs. Le programme est censé compter les caractères. Le code donné est le suivant:Problème avec l'exemple 1.5.2 dans le livre de K & R sur C

#include <stdio.h> 

/* count characters in input; 1st version */ 
main() 
{ 
    long nc; 
    nc=0; 
    while (getchar() != EOF) 
    ++nc; 
    printf("%ld\n", nc); 
} 

Pour la compilation, je remplace main() par int main(). Mais je suppose que ce n'est pas pertinent à la question. Le programme compile et fonctionne bien. Mais il ne compte tout simplement pas les caractères tels qu'ils étaient écrits. Est-ce que je manque quelque chose? Quelque chose aurait pu changer dans la façon dont les compilateurs modernes traitent un exemple de code tel que celui-ci depuis que le livre a été écrit? Toute aide que les bonnes personnes sur ce forum pourraient être en mesure d'offrir serait grandement appréciée.

Best, Dan

+1

Quelle contribution donnez-vous le programme et ce qui est imprimé? – Mark

+1

Donnez-vous au programme un fichier pour stdin? par exemple. programme

+0

Procurez-vous la deuxième édition de K & R. La première édition est une pièce de musée, et est antérieure à la norme C89 de 20 ans d'une décennie. (J'ai une copie de la première édition, je l'apprécie toujours, mais ce n'est pas le bon livre pour apprendre le C à partir de maintenant, la deuxième édition est celle à utiliser.) –

Répondre

5

Le programme affiche uniquement le nombre de caractères après la lecture d'une "fin de fichier". Avec l'entrée interactive, vous pouvez générer une "fin de fichier" via ctrl + d (au moins sur * NIX, aucune idée sur les fenêtres). Sachant cela, le programme fonctionne correctement ici.

+1

Control-Z sous Windows pour EOF –

5

En plus de la valeur de retour de la principale, il semble OK.

Est-ce que vous faites le CtrlD (Unix) ou Ctrl Z (Windows) à la fin de l'entrée si vous entrez les valeurs du clavier?

5

Bien que les autres réponses sont techniquement correct, je pense que cet exemple (1.5.2) et le suivant (1.5.3) sont source de confusion pédagogique. Il suffit de google "personnage en comptant 1.5.2" et vous trouverez beaucoup d'autres qui ont été rattrapés par cet exemple, tout comme l'OP a fait. La raison pour laquelle il est si confus est qu'il n'y a pas d'explication dans le texte sur la façon de générer le caractère EOF en mode interactif, ET les exemples précédents ont produit les résultats dès que "retour" a été entré. Ainsi, tout débutant à C assumerait que le programme 1.5.3 devrait faire la même chose ...

Je voudrais proposer le code alternatif suivant, qui produit le résultat attendu :

#include <stdio.h> 
#define  EOL '\n' 

main() 
{ 
    long nc; 
    int c; 
    nc = 0; 

    while ((c = getchar()) != EOF) 
    { 
     ++nc; 
     if (c == EOL) 
     { 
      /* Print number of input characters (not including return character) */ 
      printf("%ld\n", nc-1); 
      nc = 0; 
     } 
    } 
} 

Le seul élément de C qui n'est pas déjà expliqué dans le texte est l'instruction if, qui est actuellement expliquée dans la section suivante (1.5.3). J'espère que ce petit exemple alternatif servira à aider les autres qui ont été rattrapés par l'exemple original du livre K &. Un bon « exercice 1.7b » serait d'examiner les différences entre les deux versions et expliquer vérifier leur sortie les mêmes résultats (après avoir lu sur CtrlD/CtrlZ des autres réponses).

+0

Merci! Cet exemple était juste ce que j'avais besoin de comprendre! –

0

Il convient également de noter que Ctrl + z (qui apparaîtra comme^Z dans la console) ne peut pas être simplement entré n'importe où dans l'entrée de la console; vous devez l'entrer en tant que première entrée de votre dernière ligne de chaîne/texte/caractères. E.G

Picture of initial input Ctrl + z

Comme vous pouvez le voir dans cet exemple, je tapé dans le texte aléatoire et après chaque ligne terminée, j'appuyé sur Entrée. MAINTENANT C'EST IMPORTANT !!! Lorsque vous appuyez sur Entrée sur la dernière ligne, elle appelle l'EOF (End-of-File) et le reste du code s'exécute comme prévu.

Fully executed code

Note:

  • Même si Ctrl + z apparaît comme^Z, il est pas compté comme un caractère par le programme cependant plusieurs fois que vous appuyez dessus.
  • De même, les caractères après ctrl + z ne sont pas comptés.
  • est compté par Entrez ce programme

Source: EOF in Windows command prompt doesn't terminate input stream

Questions connexes