Wczytywanie godziny (hh:mm) - jak wyczyścić bufor klawiatury?

0

Witam, mam następujący problem.

Muszę napisać program, który wczyta od użytkownika dokładnie 5 znaków na raz, następnie, jeśli znajdzie błąd, to wypisze, na czym dokładnie on polega i da użytkownikowi możliwość poprawienia danych (zakładam, że również w postaci wprowadzenia 5 znaków na raz).

Problem polega na tym, że program co prawda wyłapuje wszystkie sytuacje błędne (na razie pominąłem warunki określające zakres liczb reprezentujących godziny i minuty, gdyż najpierw chcę naprawić powstałe już błędy), ale nie potrafi wyczyścić bufora klawiatury i gdy użytkownik poda godzinę ponownie, konsola cały czas czeka na dane.

Moja wiedza w zakresie języka C jest minimalna i na chwilę obecną nie jestem w stanie naprawić tego błędu samodzielnie, choć może się okazać, że łatwiej będzie napisać kod ponownie, niż naprawiać ten w obecnej formie.

<code class="c">#include <stdio.h>
#include <ctype.h>

main()
{

	char godzina[6];

	for (int x = 0; x < 6; x++) {
		godzina[x] = getchar();
	}

	while (godzina[5] != '\n') {
		printf("\nWprowadziles za duzo znakow. Podaj godzine (hh:mm):   ");
		while (getchar() != '\n')
			;
		for (int x = 0; x < 6; x++) {
			godzina[x] = getchar();
		}
	}

	while (isdigit(godzina[0]) == 0 || isdigit(godzina[1]) == 0|| isdigit(godzina[3]) == 0 || isdigit(godzina[4]) == 0) {
		printf("\nBledne dane. Do podania godzin i minut uzyj tylko cyfr:   ");
		while (getchar() != '\n')
			;
		for (int x = 0; x < 6; x++) {
			godzina[x] = getchar();
		}
	}

	while (godzina[2] != ':') {
		printf("Bledne dane. Jako separatora uzyj dwukropka:   ");
		while (getchar() != '\n')
			;
		for (int x = 0; x < 6; x++) {
			godzina[x] = getchar();
		}
	}

	printf("\n\nKoniec programu.\n\n");
	return 0;
}

Próbowałem przeanalizować również alternatywny sposób, który został mi podsunięty, jednak z uwagi na moją niewielką wiedzę nie potrafię odpowiedzieć sobie na pytanie, czemu w tym przypadku program przepuszcza np. 23:111. Gdyby ktoś wytłumaczył mi, czy jest sens zrobić to za pomocą funkcji fgets(), to byłbym bardzo wdzięczny.

#include <stdio.h>
#include <ctype.h>

main()
{

	int isIncorrect = 1;

	do {
		char fullTime[6];
		fgets(fullTime, 6, stdin);
		printf("\n%c\n", fullTime[5]);

		// check time format
		if (fullTime[5] != '\0') {
			printf("Too many characters!");
		}
		else if (fullTime[2] != ':') {
			printf("Wrong format!");
		}
		else if (!(isdigit(fullTime[0]) && isdigit(fullTime[1]) && isdigit(fullTime[3]) && isdigit(fullTime[4]))) {
			printf("Not a number!");
		}
		else {
			printf("%s", fullTime);
			isIncorrect = 0;
		}
		puts("");
	} while (isIncorrect);

	return 0;
}

Z góry dziękuję za, mam nadzieję, szybką pomoc, gdyż straciłem już na to zadanie 4 dni i obawiam się, że mogę nie zdążyć zrobić tego zadania w pełni poprawnie.

0

Lepiej zrobić dłuższy strumień i sprawdzić ile jest w nim znaków, o tak

 
#include <stdio.h>
#include <string.h>


int main()
{
    char fullTime[12];
    fgets(fullTime, 12, stdin);
    if (strlen(fullTime) == 6) puts("0k");
    else puts ("zle");
}

Sprawdzam czy jest 6 znaków bo przecież znak nowej linii też tam trafi. Albo też zrób sobie tablicę "śmieć" np na 1000 znaków i je tam wczytaj

0

Dziękuję bardzo za tę pomocną wskazówkę, póki co wszystko działa prawie idealnie.

 
#include <stdio.h>
#include <ctype.h>
#include <string.h>

main()
{

	char godzina[12];
	int czy_bledna = 1;

	do {
		printf("\n\nPodaj godzine w formacie (hh:mm):   ");
		//wprowadzenie danych
		fgets(godzina, 12, stdin);

		//sprawdzenie, czy wprowadzono dokladnie 5 znakow
		if (strlen(godzina) != 6) {
			printf("\nBledne dane. Nalezy podac dokladnie 5 znakow (hh:mm).\n");
		}

		//sprawdzenie, czy wprowadzone dane to liczby
		else if (isdigit(godzina[0] - '0') && isdigit(godzina[1] - '0') && isdigit(godzina[3] - '0') && isdigit(godzina[4] - '0')) {
			printf("Bledne dane. Godziny (hh) i minuty (mm) musza miec wartosci liczbowe.\n");
		}

                //sprawdzenie, czy wprowadzona dana to dwukropek
		else if (godzina[2] != ':') {
			printf("Bledne dane. Jako separatora nalezy uzyc dwukropka (:).\n");
		}

		//sprawdzenie, czy wprowadzona liczba godzin jest z zakresu (0-23)
		else if (godzina[0]-'0'>2 || godzina[1] - '0' > 3) {
			printf("Bledne dane. Wartosc liczy godzin powinna byc liczba z zakresu (0-23).\n");
		}

		//sprawdzenie, czy wprowadzona liczba minut jest z zakresu (0-59)
		else if (godzina[3]-'0'>5 || godzina[4] - '0' > 9) {
			printf("Bledne dane. Wartosc liczby minut powinna byc liczba z zakresu (0-59).\n");
		}

		else {
			czy_bledna = 0;
		}

	} while (czy_bledna == 1);

	printf("\nWprowadzono dobra godzine.");

	printf("\n\nKoniec programu.\n\n");
	return 0;
}

Jedyny problem polega na tym, że gdy wpiszę coś w stylu 23:a1, to program nie alarmuje, gdy sprawdzany jest warunek, czy godzina[3] to cyfra, ale dopiero wtedy, gdy sprawdzany jest warunek, czy godzina[3] należy do przedziału [0,5]. Dlaczego tak się dzieje?

0

isdigit() jako argument przyjmuje char-a, wiec warunek powinien wyglądać tak

 if (isdigit(godzina[0]) == false || isdigit(godzina[1]) == false || isdigit(godzina[3]) == false || isdigit(godzina[4] == false))

albo

if (!isdigit(godzina[0]) || !isdigit(godzina[1]) || !isdigit(godzina[3]) || !isdigit(godzina[4])) 

W każdym razie - '0' uniemożliwiało tej funkcji poprawną pracę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1