Pętla do while wykonuje się za dużo razy

Mam tu krótki program, który ma zliczać ilość podanych znaków z klawiatury dopóki nie wciśniemy klawisza k. Mam problem z pętlą gdyż przy każdym przejściu uruchamia się ona dwa razy, zanim sprawdzi warunek. Nie wiem o co chodzi.

Zgaduję, że to kwestia znaku nowej linii, która też jest wczytywana.

Instrukcja:

while ( znak != 107 );

Powinna być usytuowana po znaku “}” zamykającym instrukcje pętli “do”… Całość powinna wyglądać tak:

do

{

printf ("Podaj znak: ");

scanf ("%c", &znak);

i++;

} while ( znak != 107 );

Pętla “do-while” działa na zasadzie minimum jednego obrotu, a następnie sprawdzenia warunku podanego w nawiasie instrukcji “while”. W twoim wypadku pętla będzie się kręcić i kręcić, ponieważ nie ma żadnego powodu aby z niej wychodzić… Ani komendy “break;”, ani instrukcji sprawdzenia warunku (instrukcja jest, lecz została oddzielona przez znak nowej linii)…

btw nie wydaje ci się tego za dużo jak na taki prosty program ? :stuck_out_tongue:

#include

@ XeonBloomfield : czy tam będzie jeden znak nowej linii , milion czy żadnego - nie ma ŻADNEJ różnicy. C(i C++) nie jest językiem w którym białe znaki odgrywają zasadniczą rolę(tak jak to jest w Pythonie np.).

@ ThaRealiestJEDI : tak jak zauważył nr47, znak nowej linii zostaje w buforze wejścia - trzeba się go pozbyć. Dodaj

fflush(stdin);

po scanf.

EDIT:

@up: w _for_ze też będzie musiał zwiększać licznik, nic się automagicznie nie robi. I jaki Wy tam break chcecie wstawiać? To, co autor napisał, jest jak najbardziej poprawne, a for by tylko utrudnił pierwsze pobieranie znaku i wtedy albo gimnastykujemy się z warunkiem albo dodajemy break. Tylko po co?

Mnie tam to nie dziwi, w końcu autor tezy o znaku nowej linii jest również autorem tych słów:

(źródło)

Ja bym nie ufał poradom programistycznym kogoś, kto pisze takie bzdury.