C : Tester un programme de comptage de mots

Résolu
SeKoYa Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   -  
SeKoYa Messages postés 152 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   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
Maker06 Messages postés 337 Date d'inscription   Statut Membre Dernière intervention   63
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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   Statut Membre Dernière intervention   5
 
Sous linux
avec gcc version 4.3.2
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Re,

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

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

Posez votre question
loupius
 
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   Statut Membre Dernière intervention   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.
0