De ce este greșit numărul personajului după prima intrare?

Am scris un program în C pentru a număra caracterele introduse de la stdin. Am vrut să folosesc o buclă pentru a permite mai mult de o intrare. (Notă: Sunt nou în programare.)

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;
}

Deci, așa cum ați ghici, bucla acceptă 5 intrări.

PROBLEMA: Când intru în Sky0 primul rezultat este bine, 3. Dar de atunci, unul este adăugat la număr. Aceasta introduce codul dame0 într-un număr de 5 , sit0 rezultă într-un număr de 4 etc.

În timp ce încercăm să depanem problema folosind prinf în diferite etape, mi-am dat seama că după primul rezultat codul găsește sfârșitul intrării, 0 , dar intră în buclă for NEVERTHELESS și așteaptă următoarea intrare cu nc ca 1 . Aceasta duce la eroarea în ieșirile corespunzătoare.

Spuneți-mi unde mă înșel? Și de ce intră în buclă chiar și după ce a detectat 0 ?

Apreciez foarte mult ajutorul și timpul tău :)

0
hmjd: Mulțumesc omului! ... Da, am corectat-o, ce terminare non-profesionist terminat cu un zero era nou ... apreciez ure time :)
adăugat autor Aki, sursa
Prasad g: Nu este clar mate ...
adăugat autor Aki, sursa
Seki: Sper că a fost pentru prasad g :)
adăugat autor Aki, sursa
nc este setat la 0 pentru fiecare iterație a bucla pentru . Buclele în timp ce se vor termina atunci când caracterul literal '0' este găsit. Am verificat ce a spus @aix și este corect, vedeți ideone.com/gw1ON pentru ceea ce am făcut. Afișează caracterul de linie nouă care face parte din intrarea ulterioară.
adăugat autor hmjd, sursa
Este posibil c == '0'? când c == '0', atunci când buclă va fi terminată. Am c = -1 de fiecare dată.
adăugat autor Prasad G, sursa
Vorbești amar? Încercați să depuneți eforturi în timp ce scrieți întrebările și introduceți codul. Altfel oamenii nu vor pierde timpul să le citească.
adăugat autor Seki, sursa

1 răspunsuri

Problema este că atunci când apăsați Enter, devine și un caracter (valoarea 0x1a) și este returnat de apelul getchar în afara bucla în timp.

Ai putea să faci ceva de genul:

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

În acest fel, nici măcar nu trebuie să folosiți un element 0 pentru a marca sfârșitul șirului.

0
adăugat
da, am corectat mate:) ... thnks :)
adăugat autor Aki, sursa
Ohk ... nou aici:) ... va face ...
adăugat autor Aki, sursa