Kezdőoldal » Számítástechnika » Programozás » Miért ugorja át a második...

Miért ugorja át a második bekérést az a drága kis program (hogy mindjárt vízbe fojtom)?

Figyelt kérdés

Az alábbi kódról van szó, hogy milyen feladatot lát el azzal nem untatnám a kedves válaszolót (röviden megválaszolva amúgyis semmilyet), de azért bemásoltam a teljes alkotást, ha esetleg valakit érdekel, a scanf utáni részek direkt vanak megjegyzésnek jelölve, mert a probléma szempontjából lényegtelenek. A problémám az, hogy a második adatbekérést ("Milyen szinu almat szeretnel enni?")egyszerűen átugorja futáskor, és nem birok rájönni miért. A kód C nyelven van és gcc-vel fordítom. Dob egy warningot is fordítás után, hogy az enum nem int típusú de ez hülyeség, mert az enum számot rendel a szavakhoz.

***********************

#include<stdio.h>

int main(){

enum het{Hetfo, Kedd, Szerda, Csutortok, Pentek, Szombat, Vasarnap} nap;

enum colors{piros, zold, sarga} col;


printf("Milyen napon szeretnél almát enni?\n"); scanf("%d",&nap);

printf("Milyen szinu almat szeretnel enni?\n"); scanf("%d",&col);

/*switch(nap)

{

case Hetfo:

case Kedd:

case Szerda:

case Csutortok:

case Pentek:

printf("Csak hetvegen tudok almat felszolgalni!\n");

break;

case Szombat:

case Vasarnap:

printf("Mivel hetvege is van, alma is van!\n");

switch(col)

{

case piros:

printf("A piros alma egeszseges, jo valasztas!\n");

break;

case zold:

printf("Vigyazz, a zold alma savanyu\n");

break;

case sarga:

printf("A sarga is cseszett finom!\n");

break;

default:

printf("Nem ism erek ilyen szinu almat.\n");

}

break;

default:

printf("A het csak 7 napbol all!\n");

break;

}*/

return 0;

}



2016. okt. 22. 18:05
1 2
 1/11 anonim ***** válasza:
Nincs probléma, beolvassa mindkettőt. Amúgy meg a warning amit kapsz nem "hülyeség", mert a C statikus típusozású révén nem szereti a típuseltéréseket, márpedig egy enum és egy int típus nem ugyanaz, a kettő között bár végez implicit konverziót, de hibaforrás.
2016. okt. 22. 18:33
Hasznos számodra ez a válasz?
 2/11 A kérdező kommentje:

Köszi a segítséget! Kis is próbáltad(?), mert nekem a világért se csinálja normálisan.

Persze az jó hogy figyelmeztet, de ebben az esetben tárgytalan.

2016. okt. 22. 18:39
 3/11 anonim ***** válasza:
Igen, printf-el visszaírattam mindkét változót, és a megfelelő értékek voltak benne.
2016. okt. 22. 19:03
Hasznos számodra ez a válasz?
 4/11 anonim ***** válasza:
51%
A problémádat az okozza hogy a scanf csak a megadott formának megfelelő karaktereket használja fel, minden mást, így az ENTER-rel keletkező sortörést is benne hagyja az input pufferben. Így a következő hívás egyből úgy veszi hogy entert nyomtál és megáll. Áthidaló megoldásként tehetsz egy getchar(); parancsot a kettő köze, de jobb lenne ha áttérnél a fgets vagy a sscanf használatára.
2016. okt. 22. 19:07
Hasznos számodra ez a válasz?
 5/11 anonim ***** válasza:
Ez környezetfüggő lehet akkor, mert nekem a whitespace-eket ilyenkor figyelmen kívül hagyja, szintén GCC-vel fordítom.
2016. okt. 22. 19:13
Hasznos számodra ez a válasz?
 6/11 anonim ***** válasza:
Pontosabban elválasztóként kezeli, de nem kezeli önálló inputként.
2016. okt. 22. 19:15
Hasznos számodra ez a válasz?
 7/11 A kérdező kommentje:
Köszi srácok mindenkinek a segítséget, és gyors, hasznos válaszokat!!!! Valóban arról lehet szó, hogy környezetfüggő, mert én is most szembesültem először ilyen problémával (most először írtam kali Linuxon programot), kipróbálom az sscanfet. Neki mi pontosan a sajátossága? Miben más a scanf-től?
2016. okt. 22. 19:39
 8/11 anonim ***** válasza:

A scanf mindig skippeli a vezető whitespaceket, ez alól csupán a %c a kivétel ami mindig a következő karaktert olvassa be, mindegy mi az (ebbe a hibába szoktak beleesni a kezdők). Ez nem fordító specifikus, ez a szabvány. A %d is kihagyja a whitespaceket, ezért nyugodtan beadhatod neki hogy " \n \t\t 123\n", be fogja olvasni az 123-t, és a pufferben marad egy "\n" a végéről.


Ami hiba és nem értem miért fordul egyáltalán le a program, az a típuskonverzió.

C-ben az "enum -> int" működik implicit (C++-ban már nem), de az "int -> enum" nem! Míg minden enum egy szám is egyben, nem minden szám enum, ezért a C szabvány nem engedi meg az "int -> enum" implicit típuskonverziót. Vélhetőleg ez zavarhatja meg a fordítót.


Másik tippem az lenne hogy rossz számot adsz be (0-2 kéne), ezért működik másoknak.

2016. okt. 22. 19:41
Hasznos számodra ez a válasz?
 9/11 anonim ***** válasza:
Bármilyen számmal működik, akár az enum tartományán kívülivel is, ez esetben a switcheknél egyszerűen a default ágra fog lépni. Elég meglep, hogy ilyen ruganyosan megy a történet C-ben, C++ esetében megszoktam, hogy ennél körülményesebb a történet :D
2016. okt. 22. 19:54
Hasznos számodra ez a válasz?
 10/11 A kérdező kommentje:
Ezt a kódot egy gyakorlatvezető csinálta, én csak gyakorlásnak másoltam le, ezért fura lenne hogy ilyen hibát ejt, de előfordulhat. Én viszont csomó mindent tanultam most ebből. Arra is rádöbbentem, hogy nem számokat adtam meg neki, hanem szavakat... úgyhogy nagyon elcsesztem, lehet valójában ezért nem működik nekem, ki fogom próbálni számokkal.
2016. okt. 22. 20:23
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!