C : Tester un programme de comptage de mots [Résolu/Fermé]

Signaler
Messages postés
152
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 août 2010
-
Messages postés
152
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 août 2010
-
Bonjour à tous,
J'ai un programme, écrit en C, en ma possession permettant normalement de compter le nombre de mots, de lignes et de caractères en entrée.
Voici le programme :

#include <stdio.h>
#include <stdlib.h>

#define DEDANS 1    /* à l'intérieur d'un mot */
#define DEHORS 0    /* à l'extérieur d'un mot */

/* compte les lignes, les mots et les
   caractère en entrée */
int main()
{
    int c, nl, nm, nc, etat;

    etat = DEHORS;
    nl = nm = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            etat = DEHORS;
        else if (etat == DEHORS) {
            etat = DEDANS;
            ++nm;
        }
    }
    printf("%d %d %d\n", nl, nm, nc);
    return 0;
}


Voici ma question : lorsque j'exécute ce programme, rien ne se passe, j'ai beau écrire des mots et faire "entrée", rien ne se produit, alors comment voir si le programme fonctionne ?? Dites moi quoi faire.

Merci par avance de vos réponses.

6 réponses

Messages postés
85
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
30 juin 2009
5
Salut SeKoYa,

Ce qui bug c'est au niveau de sa :
while ((c = getchar()) != EOF) {


voici le code réédité:
#include <stdio.h>
#include <stdlib.h>

#define DEDANS 1    /* à l'intérieur d'un mot */
#define DEHORS 0    /* à l'extérieur d'un mot */

/* compte les lignes, les mots et les
   caractère en entrée */
int main()
{
    int c, nl, nm, nc, etat;

    etat = DEHORS;
    nl = nm = nc = 0;
    do {
       c = getchar();
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            etat = DEHORS;

        else if (etat == DEHORS) {
                etat = DEDANS;
                ++nm;
                }

    }while(c != '.');
    printf("%d %d %d\n", nl, nm, nc);
    return 0;
}

Pour quitter l'entrée de caractère tape "." (un point) si tu veux modifier cette saisie change juste le while() de fin :)

Voila cordialement 0x0syscall,
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63598 internautes nous ont dit merci ce mois-ci

Messages postés
338
Date d'inscription
lundi 22 décembre 2008
Statut
Membre
Dernière intervention
27 décembre 2009
57
Si tu veux compter des mots et autres, tu devrais copier ce qui est entrée par l'utilisateur dans une chaine de caractère, parcourir cette chaine et faire tes différents tests à ce moment.

Je serai toi j'utiliserai un scanf pour récupérer les données et une boucle genre :

do{
...
}while(caratere != '.');

Mais tu peux aussi utiliser un pointeur pour parcourir ta chaine.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63598 internautes nous ont dit merci ce mois-ci

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 473
Salut,

do{
...
}while();

on l'utilise quand on veut exécuter au moins une fois la boucle

Dans l'exemple montré( depuis livre du K&R) while((c=getchar()) !=EOF ) est juste un raccourci pour ne pas être obligé initialiser c avant la boucle.
c=getchar();
while( c != EOF){

...........
  c=getchar();
}
Pour obtenir le caractère EOF il faut appuyer sur CTRL+D
Mais je pense que SeKoYa, est sous windows ;-)
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 473
Salut,

Ce qui bug c'est au niveau de sa :

while ((c = getchar()) != EOF) {


Non, il n'y a pas de bug à ce niveau.
Le programme est correct.

Tu compile avec quel compilateur. Tu es sous Windows?
Messages postés
85
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
30 juin 2009
5
Sous linux
avec gcc version 4.3.2
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 473
Re,

Ben, sous linux ça marche sans aucune correction ;-)
Pour les veinards qui sont sous Linux, il existe une commande de base incluse dans le système d'exploitation; il s'agit de wc (ce n'est pas une plaisanterie)
wc [nom du fichier]
vous donne directement le nbre de lignes, de mots et de caractères.
Messages postés
152
Date d'inscription
jeudi 28 août 2008
Statut
Membre
Dernière intervention
13 août 2010
18
Bon et bien je ne connaissais pas encore le :
do{...}while...
mais en tout cas merci beaucoup à tous.
J'eesaye de suivre le livre dans l'ordre mais il est vrai que des solutions plus pratiques existent et que je ne découvrirais pas avant quelques pages...
Encore merci et bonne continuation.