Diskuze: scanf("%d", &i) zadam ENTER a chcem aby program pokračoval
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Problém je v tom, že funkcia čaká znak(y) a potvrdenie Entrom. Keď dám len Enter, nič sa nedeje a čaká na znak(y).
if (scanf("%d", &nastaveny_cas) == 0) {
printf("OK\n");
getch();
}
else {
printf("NOK\n");
getch();
}
Tak zaprvé moc nechápu tu první podmínku..
These functions return the number of input items successfully matched
and assigned, which can be fewer than provided for, or even zero in the
event of an early matching failure.
The value EOF is returned if the end of input is reached before either
the first successful conversion or a matching failure occurs. EOF is
also returned if a read error occurs, in which case the error indicator
for the stream (see ferror(3)) is set, and errno is set indicate the
error.
Takže tak, jak to máš teď to bude (asi) dělat tohle: Pokud zadáš něco jiného než číslo, vypíše OK a bude čekat na další znak.
Funkce getch není standardní a vidím je vlastně poprvé, takže s tou ti moc neporadím
U scanf (a obecně zadávání do konzole) pozor. Vstup, co zadáš, se pošle až po ukončení vstupu - posílá se celý řádek, ne znaky. Ukončení řádku se v Linuxu dělá pomocí CTRL+D a ve windows pomocí CTRL+Z. Jinak se typicky ukončuje i enterem (ale třeba u mě na Ubuntu jen, když něco předtím zadáš).
"Tak zaprvé moc nechápu tu první podmínku."
To je len ukážka ako to čo chcem nefunguje.
Funkcia getch() je z knižnice conio.h a je windowsácka, pre linux sa dá
nahradiť funkciou:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
int getch() {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
Používa sa na zadanie znaku (stlačenie klavesy) bez nutnosti potvrdenia
Entrom.
Podľa toho, že tu zatiaľ nebola odpoveď s jednoduchým riešením myslím,
že to nebude až také jednoduché a napíšem to inakšie.
David, išlo mi o to, že mám nastavenú hodnotu na konkrétne číslo, ale
užívateľ má možnosť zmeniť ju podľa svojich predstáv. Teda:
Výpis programu:
Bla bla bla, hodnota je prednastavená na 1000, ale môžte si ju zmeniť ako
vám vyhovuje:
(tu ak užívateľ zadá Enter, program pokračuje ďalej a ostane 1000, ak
zadá iné číslo, program pokračuje so zadanou hodnotou)
Samozrejme, že to viem riešiť iným spôsobom, ale myslel som si, že to
pôjde jednoduchšie.
Tak tam můžeš dát například: Zapište novou hodnotu pro bla, pokud nechcete hodnotu změnit napište 'n'.
Takže getch() čte vstup z terminálu unbuffered, jo? A není to zbytečnost? Jako dovedu si představit použití.. Ale většinou bohatě stačí čekat na enter nějak takto:
while (getchar() != '\n')
;
Každopádně psát interaktivní konzolové aplikace (obbzvlášť pro windows) mi přijde vcelku zbytečné.. Tam je lepší udělat normální okenní aplikaci. Konzolové se hodí pro dávkové zpracování, kde se ovšem na uživatele nesmí na něco ptát a berou si vstup z argumentů při spuštění.. Případně se zavádí přepínač -i, který zapíná interaktivní ražim
Jasne že nie je problém to riešiť iným spôsobom.
Ale bežný užívateľ najradšej na potvrdenie používa Enter, nie "Zadajte
hodnotu alebo stlačte 'n'", ale " Potvrďte klávesou Enter alebo zadajte
vlastnú hodnotu" a my by sme sa mali snažiť to písať púre užívateľou
tak, aby boli čo naspokojnejší.
Jasné je aj to, že som čakal niečo v zmysle:
"Konzolové se hodí pro dávkové zpracování, kde se ovšem na uživatele
nesmí na něco ptát a berou si vstup z argumentů při spuštění."
Ale my sa tu hráme aj na céčko, v ktorom napríklad napíšeš hru a tá ak
nie je interaktívna, je o ničom.
Tak jasné..
Ale hru je lepší psát v něčem jiném, než C
To je jasné, ale vieš si predstaviť koľko sa dá získať
programátorských skúseností, keď sa pokúsiš napísať nejakú, len trochu
zložitejšiu hru v céčku?
Navyše keď ju napíšeš multiplatformovo!
Zobrazeno 8 zpráv z 8.