NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: ignorovanie scanf ?

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
expoox
Tvůrce
Avatar
expoox:18.12.2017 20:51

ahoj, vyzera to tak ze moj program ignoruje volanie scanfu ale iba pri prvej iteracii cyklu, neviete preco ?

scanf("%d", &n);
printf("wtf m %i\n",wtf++);
        queue = create_queue(n);
printf("wtf m %i\n",wtf++);
        while (true) {
                char s;
printf("wtf m w %i\n",wtf++);
                if (scanf("%c", &s) == -1)
                        break;
printf("wtf m w %i s = %c\n",wtf++,s);

konzola:

> 3
< wtf m 0
< wtf m 1
< wtf m w 2
< wtf m w 3 s =
<
< wtf m w 4
> a 3
< wtf m w 5 s = a
< wtf m w 6
 
Odpovědět
18.12.2017 20:51
Avatar
expoox
Tvůrce
Avatar
Odpovídá na expoox
expoox:18.12.2017 20:58

EDIT : zda sa ze sa to deje pri kazdej druhej iteracii

 
Nahoru Odpovědět
18.12.2017 20:58
Avatar
Michal Žůrek - misaz:18.12.2017 21:12

scanf ti totiž vezme a naparsuje enter, který jsi zmáčkl za písmenem. Dělá se to tak, že před %c, napíšeš mezeru, která ten enter "vyžere".

scanf(" %c")
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
18.12.2017 21:12
Avatar
expoox
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
expoox:18.12.2017 21:22

hmm, skusal som fflush(stdin) pred to presne koli tomu ale teraz mi doslo ze je to blbost :D dakujem

 
Nahoru Odpovědět
18.12.2017 21:22
Avatar
expoox
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
expoox:18.12.2017 23:35

tak este jedna drobnost , pri prvom vstupe vypise len wtf 1 , pri druhom vstupe mi vypise scanf 0 a potom wtf 2 , ocividne to tam zaspalo a caka na nieco ale teraz ma uz fakt nic nenapada (vstupy su a 1, a 2, a 3)

while (true) {
                char s;
                if (scanf(" %c", &s) == -1)
                        break;
                if (s == 'a') {
printf("som v A %i. krat, typ = %i\n",wtf++,typ);
                        char * a = (char*)malloc(255*sizeof(char));
                        if (scanf("%s", a) == -1)
                                break;
                        if (typ == 10)
                                analyzeNadd(queue,a);
                        else {
                                if (typ == 0) {
                                        char k;
                                        getchar();
                                        scanf("%c",&k);
                                        addChar(queue,k);
                                } else if (typ == 1) {
printf("wtf 1\n");
                                        int k;
                                        printf("scanf %i\n",scanf("%i", &k)); // IGNORE
printf("wtf 2\n");
                                        addInt(queue,k);
                                } else {
                                        float k;
                                        scanf("%f", &k);
                                        addFloat(queue,k);
                                }
....
 
Nahoru Odpovědět
18.12.2017 23:35
Avatar
Odpovídá na expoox
Matúš Olejník:19.12.2017 7:35

Ak to teda načítavaš všetko v cykle tak sa najprv načíta 'a' potom 1 tým sa dostaneš do tej vetvy if (typ == 1) vypíše sa wtf1 a čaká na ďalší scanf("%i", &k)). Potom ak ideš zadať 'a' 2 tak pokračuje v tej vetve vypísaním wtf2

Nahoru Odpovědět
19.12.2017 7:35
/* I am not sure why this works but it fixes the problem */
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 6 zpráv z 6.