NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
Libor Šimo (libcosenior):16.4.2015 10:12

Ahojte, nedarí sa mi vyriešiť toto:
mám kód
scanf("%d", &i)
a keď zadám Enter, znovu to čaká na zadanie čísla.
Skúšal som nejhaké podmienky, ale stále som to nevyriešil.
Asi to bude triviálna záležitosť, ale ak niekto vie poradiť, prečo by som vymýšľal koleso?

Odpovědět
16.4.2015 10:12
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):16.4.2015 10:26

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();
    }
Editováno 16.4.2015 10:27
Nahoru Odpovědět
16.4.2015 10:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:16.4.2015 10:48

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áš).

Nahoru Odpovědět
16.4.2015 10:48
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):16.4.2015 12:51

"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. ;)

Nahoru Odpovědět
16.4.2015 12:51
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:16.4.2015 13:15

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 ;)

Nahoru Odpovědět
16.4.2015 13:15
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):16.4.2015 13:20

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í."
:D
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. ;)

Editováno 16.4.2015 13:25
Nahoru Odpovědět
16.4.2015 13:20
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:16.4.2015 13:26

Tak jasné.. :)

Ale hru je lepší psát v něčem jiném, než C :D

Nahoru Odpovědět
16.4.2015 13:26
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):16.4.2015 13:37

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!

Editováno 16.4.2015 13:38
Nahoru Odpovědět
16.4.2015 13:37
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.