2010-05-17 5 views
0

La sortie du nombre de caractères est le nombre réel. plus 3. Je ne sais pas pourquoi?comptage des caractères du programme en c

Voici le code:

void main(void) 
{ 

int ch,w=0,c=0; 
do 
{ 
    ch=getche(); 
    ++c; 
    if(ch==32) 
    { 
     ++w; 
     ++c; 
    } 

}while(ch!=13); 
printf("\nnum of characters is %d",c); 
printf("\nnum of words is %d",w); 
     getch(); 
} 
+1

Vous pouvez choisir une réponse maintenant. – Betamoo

+5

Cela peut sembler inutile, mais 'void main' est un signe assez certain que vous apprenez d'un mauvais livre ou d'un enseignant. Juste google 'void main' pour beaucoup de discussion. –

Répondre

0
void main(void) 
{ 
    int ch,w=0,c=0,lastch=32; 
    while((ch = getche()) != 13) //get input and check if it's ENTER key 
    { 
     ++c; 
     if(ch == 32 && lastch != ch) //make sure two continuous spaces are not counted as a word as pointed out by paxdiablo 
      ++w; 
     lastch = ch; 
    } 
    if(lastch != 32) //for a word with no space 
     ++w; 
    printf("\nnum of characters is %d",c); 
    printf("\nnum of words is %d",w); 
    getch(); 
} 

Vous pouvez utiliser char au lieu de int.

3
++c; 
    if(ch==32) 
    { 
     ++w; 
     ++c; 
    } 

Vous avez compté deux fois le caractère d'espace. Retirez le 2ème ++c.

4

Vous êtes espaces de double comptage:

++c; 
if(ch==32) 
{ 
    ++w; 
    ++c; 
} 

Vous avez déjà c incrémenté; vous n'avez pas besoin de le refaire. Vous comptez également la nouvelle ligne en tant que personnage, et votre nombre de mots est un décompte du nombre d'espaces, qui sera court ("foo bar" a deux mots, mais un espace). Selon exactement ce que vous voulez vérifier, les fonctions standard comme isspace peut-être plus facile (mais il retourne vrai pour les choses en plus ' «)

+0

hehe, les trois premières réponses sont presque identiques :) +1 pour vous trois pour être rapide et avoir des cerveaux liés. – catchmeifyoutry

7

Vous incrémenter cdeux fois pour le caractère d'espace.

Votre déclaration if doit être juste:

if(ch==32) 
    ++w; 

Vous avez un autre bug subtil et dans la mesure où la chaîne hellospcspcthere (avec deux places) enregistrera en trois mots dans votre code.

C'est ainsi que I l'aurait écrit pour éviter ces problèmes. Notez l'utilisation de lastch pour éviter de compter les séquences d'espace en tant que mots multiples.

int main(void) { 
    int ch = ' ', lastch, w = 0, c = 0; 

    do { 
     lastch = ch; 
     ch = getchar(); 
     ++c; 
     if (ch == ' ') { 
      if (lastch != ' ') { 
       ++w; 
      } 
     } 
    } while (ch != '\n'); 

    if (lastch != ' ') { 
     ++w; 
    } 

    printf("num of characters is %d\n",c); 
    printf("num of words is %d\n",w); 

    return 0; 
} 
+1

Ne gère pas le cas d'entrée sans espaces (le nombre de mots devrait être 1 dans ce cas, pas 0) –

+0

Oui, il y avait quelques cas de bordure (celui-là, plus commençant par un espace) qui n'étaient pas traités par le code original. Je pense que je les ai tous pris maintenant :-) – paxdiablo

+1

Au lieu de 'lastch', j'utiliserais une variable d'état' inword': 'if (ch == '') {inword = 0; } else {if (! inword) {++ w; inword = 1}} ', mais votre solution éditée fonctionne bien aussi. –

2

Vous comptez des espaces deux fois.

En outre, il est plus facile à lire si vous utilisez littéraux de caractères comme ch==' ' au lieu de ch==32

1

Chaque espace est compté deux fois

3

Chaque espace est compté deux fois ...

++c; 
    if(ch==32) 
    { 
     ++w; 
     ++c; // char is counted again 
    } 

Code Modification :

++c; 
    if(ch==32) 
    { 
     ++w;  
    } 
2

Vous êtes ici rementing c deux fois, si le caractère lu est 32.

3

Vous ajoutez à c deux fois lorsque ch==32.En outre, vous ajoutez à c lorsque ch==13.