C : Tester un programme de comptage de mots

Résolu/Fermé
SeKoYa Messages postés 152 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 août 2010 - 2 janv. 2009 à 12:28
SeKoYa Messages postés 152 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 août 2010 - 5 janv. 2009 à 17:22
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

0x0syscall Messages postés 85 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 30 juin 2009 5
2 janv. 2009 à 13:12
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
Maker06 Messages postés 337 Date d'inscription lundi 22 décembre 2008 Statut Membre Dernière intervention 27 décembre 2009 63
2 janv. 2009 à 14:24
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
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
2 janv. 2009 à 14:38
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 ;-)
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
2 janv. 2009 à 14:03
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?
0
0x0syscall Messages postés 85 Date d'inscription lundi 28 avril 2008 Statut Membre Dernière intervention 30 juin 2009 5
2 janv. 2009 à 14:11
Sous linux
avec gcc version 4.3.2
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
2 janv. 2009 à 14:32
Re,

Ben, sous linux ça marche sans aucune correction ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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.
0
SeKoYa Messages postés 152 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 août 2010 18
5 janv. 2009 à 17:22
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.
0