Vyprázdnění bufferu klávesnice – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vyprázdnění bufferu klávesnice – C / C++ – Fórum – Programujte.comVyprázdnění bufferu klávesnice – C / C++ – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

Toto vlákno bylo označeno za vyřešené.
25. 6. 2017   #1
-
0
-

Ahoj, začinám s Céčkem a jedu dle učebnice od Pavla Herouta.

Zadání příkladu bylo takové, abych si zkusil funkci závorek v podmínce a uvědomil si jejich rozdíl a důležitost. To jsem pochopil. 
Ale v přiloženém vyřešeném příkladě je u prvního if, while, které pokud dobře chápu, čeká na to, až c = '\n' a pokud to nastane, tak cyklus ukončí. Vůbec nechápu proč to tam je a proč to bez toho nefunguje. A co konkrétně znamená "vyprázdnění bufferu klávesnice". 

Díky za rady a vysvětlení "polopatě".

/*
 * cv05.c    v.2.0
 *
 * Chybna priorita v nacitani a v porovnavani
 * ==========================================
 *
 */

#include <stdio.h>

int main(void)
{
  int c;

  /* spravna priorita */
  printf("Zadej velke pismeno (A az Z): ");
  if ((c = getchar()) >= 'A'  &&  c <= 'Z') {
    printf("Spravna priorita operatoru:\n");
    printf("Bylo zadano pismeno s ASCII hodnotou: %d\n", c);
  }

  /* vyprazdneni bufferu klavesnice */
  while (getchar() != '\n')
    ;

  /* chybna priorita */
  printf("Zadej velke pismeno (A az Z): ");
  if (c = getchar() >= 'A'  &&  c <= 'Z') {
    printf("Chybna priorita operatoru:\n");
    printf("Bylo zadano pismeno s ASCII hodnotou: %d\n", c);
  }
  return 0;
}

Nahlásit jako SPAM
IP: 178.255.169.–
KIIV
~ Moderátor
+43
God of flame
25. 6. 2017   #2
-
0
-

#1 kozomelec
klasicka ukazka "bad practice" - delani hromady akci na jednom radku. Neda se to krokovat, je tu obrovske nebezpeci, ze tam nekdo ty zavorky zapomene a najednou misto prirazeni nacteneho znaku do c a zjisteni, jestli je to velke pismeno, se prvni udelaji porovnani, logicky and a pak se teprve vysledek priradi do c (o hodnotach 0 a 1, podle toho, co uz bylo v c z predchozich kol)

Co se tyce vyprazdneni bufferu - kdyz neco zadavas z klavesnice, tak z getchar nevymlatis jedinej znak, dokud to neodklepnes enterem. Az pak mas k dispozici vsechny znaky az do znaku odradkovani. Odstranovani bufferu a podobne je zase dalsi "bad practice". Lidi maji pak tendenci delat interaktivni programy ktery pokazdy zahodi cely buffer a teprve pak cekaji nove data. To je sice krasne, pokud u toho sedi clovek, ale naprosto nepouzitelne k automatickemu testovani. Nemuzes do programu proste nasmerovat testovaci soubor, ktery by se pak nacetl, jako bys to psal na klavesnici, jelikoz to muze zlikvidovat uplne vse (v tomto pripade jen zbytek radky). Na otestovani pak musis delat specialni programy, ruzne sachovat se spoustenim procesu a presmerovanim vstupu a vystupu, ruzne casovat kdy se ma neco poslat aby to tyhle kaviny nezahodily......

Proste, co je sakra spatneho na tom mit o radek vic?

  c = getchar();
  if ((c >= 'A')  &&  (c <= 'Z')) {
    // ...
  }

Je to citelnejsi, jasnejsi a temer nemozne udelat chybu v tom prirazeni. Neni umeni naprasit 40 prikazu na jednu radku, daleko vetsi umeni je pak takovou prasarnu rozlustit. Nedej boze, ze pak zjistis, ze je v tom chyba. V debuggeru je to jedna radka, jeden krok, a neda se proste zjistit, co se tam deje nejak podrobneji.

Nahlásit jako SPAM
IP: 93.91.151.–
Program vždy dělá to co naprogramujete, ne to co chcete...
28. 6. 2017   #3
-
0
-

#2 KIIV

Díky moc za tvůj čas a odpověď! Takže jestli dobře chápu, tak příkaz getchar() kromě samotného znaku načte do paměti i enter? To jsem nevěděl, hned mi to vše dává mnohem větší smysl. 

Nahlásit jako SPAM
IP: 178.255.169.–
Staon0
Návštěvník
28. 6. 2017   #4
-
0
-

#3 kozomelec
Z terminálu se čte po řádkách, takže getchar() se odblokuje teprve poté, co zmáčknete Enter, a vrátí první znak z řádky. Následující volání getchar() se nezablokují, ale rovnou vrací postupně znaky řádky, tak dlouho, dokud nedojdete k Enteru. Pak se getchar() opět zablokuje a čeká dokud znovu Enter nezmáčknete.

Nahlásit jako SPAM
IP: 94.142.234.–
28. 6. 2017   #5
-
0
-

#4 Staon
Super, děkuji! 

Nahlásit jako SPAM
IP: 178.255.169.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032019 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý