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


(Krzychu224) #1

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.


(Sawyer47) #2

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


(Xeon Bloomfield) #3

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)...


(Drobok) #4

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

#include

(Fiołek) #5

@ 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 forze 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?


(Somekindsoftware) #6

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.