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 ?
#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.