[debutant] getchar et les boucles en c

Résolu/Fermé
elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008 - 10 avril 2008 à 21:42
elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008 - 11 avril 2008 à 06:56
Bonsoir,
je debute dans la programmation en c j'essaye de faire les exemples que j'ai trouvé dans un livre
mais j'ai un problem a l'execution
voila le code


#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* count lines, words, and characters in input */
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c == '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}

je compile le programme sans problem dans une fenêtre terminal a l'aide de la commande cc sous ubuntu7.10
et je l'execute avec ./a.out
mais le programme ne se termine pas je n'arrive pas a sortir de la boucle que si j'appuie sur la combinaison des touches ctrl+c
mais le problem c'est que la derniere instruction ne s'execute pas (printf)
donc je n'ai pas de resultat
j'ai utilisé un autre code avec le meme test d'arret et c'est la meme chose et quand j'ai changé le test d'arret ça marche je pense que le probleme est dans getchar()
mais je n'arrive pas a le localiser pouriez vous m'aider
merci a tous

3 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 avril 2008 à 22:20
Salut,

si je ne me trompe pas il s'agit de livre du Kernighan & Ritchie (K&R)

le code est correct est il est conçu pour lire dépuis l'entrée standard

Sous linux il fonctionne sans problème
lami20j@debian:~/trash$ cat ccm.c
#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* count lines, words, and characters in input */
main()
{
        int c, nl, nw, nc, state;
        state = OUT;
        nl = nw = nc = 0;
        while ((c = getchar()) != EOF) {
                ++nc;
                if (c == '\n')
                        ++nl;
                if (c == ' ' || c == '\n' || c == '\t')
                        state = OUT;
                else if (state == OUT) {
                        state = IN;
                        ++nw;
                }
        }
        printf("%d %d %d\n", nl, nw, nc);
}
lami20j@debian:~/trash$ gcc ccm.c
lami20j@debian:~/trash$ ./a.out
voici un test
pour ton code
2 6 28
lami20j@debian:~/trash$
1
elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008
10 avril 2008 à 22:34
merci
oui le livre est
The C programming Language
By Brian W. Kernighan and Dennis M. Ritchie.

mais comment tu as sortie du programme vous avez taper sur quoi
et merci
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
10 avril 2008 à 22:40
Avec la combinaison de touches Ctrl+D
1
elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008
11 avril 2008 à 06:52
oui ça marche maintenant
avant quand je click sur ctl+D il m'affiche un caractère arabe
j'ai supprimé l'arabe du clavier et ça a marché
merci
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
10 avril 2008 à 22:12
Salut,

EOF pour End Of File est utilisé pour les fichiers, pour savoir quand on est arrivé au bout. Il corresponds au caractère Ctrl + D.
Le problème c'est que quand on tape Ctrl + D, ça interrompt le programme.

Essaie plutôt d'utiliser EOL pour End Of Line, comme ça dés que tu tapes sur entrée ta boucle est finie.
0
elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008
10 avril 2008 à 22:39
merci
mais le programme ne se compile pas avec EOL

il affiche

count.c: In function «main":
count.c:10: erreur: «EOL" undeclared (first use in this function)
count.c:10: erreur: (Each undeclared identifier is reported only once
count.c:10: erreur: for each function it appears in.)


merci encore
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 > elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008
10 avril 2008 à 22:45
Prends '\n' alors.
0
elmadina Messages postés 33 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 30 juin 2008 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
11 avril 2008 à 06:56
merci beaucoup
oui ça marche mais je ne pourait pas compter les lignes
merci encore
0