Pourquoi le nombre de caractères est-il erroné après la première entrée?

J'ai écrit un programme en C pour compter les caractères entrés depuis stdin. Je voulais utiliser une boucle pour autoriser plus d'une entrée. (Remarque: je suis novice en programmation.)

main()
{
    long nc;
    int c;
    int kc=1;
    for (kc=1;kc<=5;kc=kc+1)
    {
        nc=0;
        c= getchar();
        while(c != '0')
        {

        ++nc;
        c=getchar();
        }

        printf("%1d\n",nc);

    }
    return 0;
}

Donc, fondamentalement, comme vous pouvez le deviner, la boucle accepte 5 entrées.

PROBLEME: Quand j'entre Sky0 le premier résultat est correct, 3. Mais à partir de ce moment, on en ajoute un au compte. C'est en entrant dame0 que le résultat est 5 , sit0 donne le nombre de 4 etc.

En essayant de déboguer le problème en utilisant prinf à différentes étapes, j'ai réalisé qu'après le premier résultat le code trouve la fin de l'entrée, 0 , mais entre dans la boucle for NEVERTHELESS et attend l'entrée suivante avec nc en tant que 1 . Cela conduit à l'erreur dans les sorties correspondantes.

S'il vous plaît dire où je vais mal? Et pourquoi est-il entré dans la boucle même après avoir détecté 0 ?

Appréciez grandement votre aide et votre temps :)

0
hmjd: Merci mec! ... Oui, je l'ai corrigé, ce qui était un moyen non professionnel de terminer avec un zéro était neway ... j'apprécie le temps :)
ajouté l'auteur Aki, source
prasad g: Ce n'est pas clair mate ...
ajouté l'auteur Aki, source
Seki: J'espère que c'était pour prasad g :)
ajouté l'auteur Aki, source
nc est défini sur 0 à chaque itération de la boucle pour . La boucle while sera terminée lorsque le littéral de caractère '0' sera trouvé. Je vérifie ce que @aix a déclaré et c'est correct, voir ideone.com/gw1ON pour ce que j'ai fait. Il montre le caractère de nouvelle ligne faisant partie de l'entrée suivante.
ajouté l'auteur hmjd, source
Est-ce possible c == '0'? quand c == '0' alors alors que la boucle sera terminée. J'ai c = -1 à chaque fois.
ajouté l'auteur Prasad G, source
Parlez-vous l'argot? S'il vous plaît faites des efforts tout en écrivant vos questions et indentant le code. Sinon, les gens ne perdront pas de temps à le lire.
ajouté l'auteur Seki, source

1 Réponses

Le problème est que lorsque vous appuyez sur Entrée, cela devient aussi un caractère (valeur 0x1a), et il est renvoyé par l'appel getchar en dehors de la boucle while.

Vous pourriez faire quelque chose comme:

while (getchar() != '\n') nc++;

De cette façon, vous n'avez même pas besoin d'utiliser un 0 pour marquer la fin de la chaîne.

0
ajouté
oui je l'ai corrigé mate:) ... thnks :)
ajouté l'auteur Aki, source
Ohk ... nouveau ici:) ... fera l'affaire ...
ajouté l'auteur Aki, source