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

Wczytywanie godziny (hh:mm) - jak wyczyścić bufor klawiatury?
BE
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:4
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.

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

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

edytowany 2x, ostatnio: Believer
SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
0

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

Kopiuj
 
#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

BE
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 8 lat
  • Postów:4
0

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

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

SI
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
0

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

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

albo

Kopiuj
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ę.

edytowany 3x, ostatnio: sig
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)