sziasztok!
lécci segítsen már valaki. hogyan tudok scanf -fel beolvasni %c,%c formátumban? egy x,y koordinátát kellene beolvasni, ahol az x az a-h -ig az y pedig 1-8 -ig (sakk koordináták) gondoltam a scanf ("%c,%c) az jó lenne, de nem működik, nyilván az entert is beolvassa mint karakter és így már ciklusban futtatva nem igazán jó. esetleg valakinek ötlete?
- 3272 megtekintés
Hozzászólások
már jó régen volt, de ha jól rémlik valahogy így volt:
scanf("%c,%c\n",&x,&y);
- A hozzászóláshoz be kell jelentkezni
ezt én is próbáltam már, de ha így nézed akkor nem smakkol teljesen:
for (i=0,i<5;i++)
scanf("%c,%c\n",&tomb[i].x,&tomb[i].y);
de plusz egyszer lefut és nem tudom, hogy miért
- A hozzászóláshoz be kell jelentkezni
for (i=0,i<5;i++)
az i=0 után ugye ; van?
- A hozzászóláshoz be kell jelentkezni
persze, csak elgépelés volt
- A hozzászóláshoz be kell jelentkezni
Vagy olvasd be soronként sscanf-el és úgy dolgoztasd fel soronként. Én annakidején a diplomamunkámmal ütköztem hasonló problémába. Nekem így sikerült megoldanom.
- A hozzászóláshoz be kell jelentkezni
kötött a beolvasási szintaxis
x,y (ahol x a-h;y 1-8)
- A hozzászóláshoz be kell jelentkezni
Aha
Akkor a soronkénti analízis nem megoldható.
Az nem megoldés hogy egy másik tömbbe egy az egyben berántja mindíg az adatokat, és onnan dolgozol?
- A hozzászóláshoz be kell jelentkezni
szerintem olvasd be karakterlanckent es ugy dolgozd fel. en igy csinalnam :)
---
"A legjobb dolgok az életben nem dolgok."
- A hozzászóláshoz be kell jelentkezni
char sor[20];
for(i=0;i<5;i++)
{
scanf("%s",sor);
sscanf(sor,"%c,%d",&tomb[i].x,&tomb[i].y);
}
Ez peldaul mukodik, ha az elso koordinata karakter, a masodik meg szam. Egyebkent tutibiztosan mukodot szabvany C-ben ugy tudsz irni, hogy bizonyos jelig a bemenetet puffereled (realloc es EOF segithet), es utana a bemeneti teljes puffert karakterenkent olvasva probalod meg ertelmezni. Mas teljesen hibamentesen, jol mukodo modon nem hiszem, hogy megirhato a dolog, mert szabvany C-ben nincs lehetoseg a bemeneti pufferbol a nem szukseges adatokat torolni, azokat is be kell olvasni, de nem kell ertelmezni.
- A hozzászóláshoz be kell jelentkezni
Azért erre ne szoktassuk az embereket! Szép kis buffer overflow vulnerabilityt láthatunk. Ha fgets()-sel olvasnád be a sort scanf helyett, akkor megadhatnád, hogy mennyi a max hossza (de egyébként ugyanígy megy).
(Persze, oké, értem é, hogy egy sakkprogramban nem nagy gáz egy buffer overflow, sokmindenre nem lehet kihasználni, de akkor sem jó így megszokni.)
- A hozzászóláshoz be kell jelentkezni
Megtaláltam a diplomamunkámat :D
Na én abban így csináltam meg:
for (i = 1; i < ciklus+1 ; i++)
{
fgets(line,255,tf); //beolvas egy sort
sscanf( line, "%lf %lf \n", &xkord, &ykord); //és feldolgozza
}
Ez szedte be az adatokat, bból a tömbből amire a tf-mutató mutatott.
- A hozzászóláshoz be kell jelentkezni
elméletileg a C könyv szerint amit néztem az fflush(stdin) -nek törölni kéne a puffert:
for (i=0;i<5;i++)
{
scanf("%c,%c",&tomb[i].x,&tomb[i].y);
fflush(stdin);
}
elméletileg az fflush-nek törölni kéne a pufferben maradt entert, de nem teszi.. jó oka van rá biztosan :-)
- A hozzászóláshoz be kell jelentkezni
az fflush() csak a kimeneti buffert irja ki a fizikai eszkozre. bemeneti esetben (olvasa's, fscanf(), fread(), read(), barmi ilyesmi esetben) nincs hata'sa.
lasd: `man fflush`:
[The function fflush forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write
function. The open status of the stream is unaffected.
A.
- A hozzászóláshoz be kell jelentkezni
Így van ezt én onnan tapasztaltam mmeg annó hogy a diplomamunkámben sikerült hamarabb zárni a filet mint flushholni :D "Jó sok" minden volt a kimenetben".
- A hozzászóláshoz be kell jelentkezni
Van egy programozzunk C nyelven szép vastag könyvem, abban van pont egy enteres példa és ott használja az fflush-t..
blabla..
"A probléma egyszerűen kiküszöbölhető, ha a hiba fellépése esetén az adatbeviteli (input) puffert kiürítjük. Erre a szabványos függvénykönyvtár szintén tartalmaz megoldást az fflush függvény meghívásával.Ehhez azonban azt is kell tudni, hogy a scanf nem a billentyűzetről olvas adatokat, hanem az stdin szabványos adatfolyamból (stream-ből)"
- A hozzászóláshoz be kell jelentkezni
Szabvanyos C nyelven az fflush() nem uriti a bemeneti puffereket, csak es kizarolag a kimenetti puffereket. Ez sok helyen szokott hiba lenni a programokodokban. AZ fflush() olyaten formaju mukodesere, hogy uriti az stdin-t, ne szamitsunk. A Programozzunk C nyelven konyvrol pedig megvan a velemenyem: csak es kizarolag Turbo C-re epit, pl conio.h meg ilyesmi sincs szabvany C-ben. Na mindegy, aki C-t akar tanulni, annak a K&R bibliat ajanlom.
- A hozzászóláshoz be kell jelentkezni
while(!feof(fr)){
if(fgets(buff,255,fr) == NULL) { break; }
if(sscanf(buff, "%d %d", &col1 , &col2) < 2) { continue; }
column1[n] = col1;
column2[n] = col2;
n++;
}
fclose(fr);
a formatumot nyilvan at kell irni
--
http://marvin.elte.hu/ - the astrophysics archive
- A hozzászóláshoz be kell jelentkezni
ha explicite sza'mokat olvasol be, akkor miert nem
[s]scanf([buffer,] "%d,%d",&x,&y);
alakban probalod? ez joval elegansabb/celtudatosabb, mintha magukat a szamjegyeket (mondjuk cx-be es cy-be) olvasod be es abbol a '0' ascii kodjanak (48 = 0x30) levonasaval kapod meg az x e's y erteke't.
illetve szinten csatlakozva'n az elo"ttem szolohoz, a sorbol valo beolvasast es a sztring -> sza'm konverziot kulonvalasztana'm. igy kesobb sokkal egyszerubben lehet boviteni a programot felhasznalobaratabba' (pl. a #-vel kezdodo sorok legyenek kommentek, mi van ha a felhasznalo egy sorban 2-nel tobb/kevesebb er'te'ket adott be, stb-stb). Szvsz erdemes ezeket is a'tgondolni, me'gha nehezzebbe/hosszabba' is teszik a programot... hosszu tavon mege'ri.
- A hozzászóláshoz be kell jelentkezni
Sziasztok!
Nekem is akad egy scanf-es problémám. Egyik barátom hívta fel rá a figyelmemet és nem sikerült megoldani. A Probléma a következő: szeretném használni a scanf visszatérési értékét annak megállapítására hogy az általa bekért adat megfelel-e a formázó stringben megadott formátumnak. Tehát egy biztosítást szeretnék így a programba építeni a bekéréshez. No de a kód amire jutottunk az a következő:
hiba = scanf("%d", &alap);
while (hiba != 1) {
printf("Kerek egy termeszetes szamot: ");
fflush(stdin);
hiba = scanf("%d", &alap);
}
Ennek elvben működnie kellene, a barátom windowsban írta a kódot egy dev c++ nevű környezetben ami a fordításhoz gcc-t használ. És érdekes módon ott működik, de se mac-en se linuxon nem képes normálisan funkcionálni, mivel ha valami betűt vagy írásjelet írsz be az első bekéréskor, akkor onnantól kezdve a scanf nem működik. Végtelen ciklusba fut és csak írja, hogy "Kerek egy termeszetes szamot: ". Volna valakinek ötlete, hogy mi okozza a hibát nem windowsos rendszeren?
- A hozzászóláshoz be kell jelentkezni
Ehh, es ebben te hol latsz beolvasast pl. az STDIN-rol?
- A hozzászóláshoz be kell jelentkezni
Az fflush már a végén jött ötletnek, de semmit nem használ az sem, csak benn hagytam. ..A 2. futásnál mintha resetelni kellene a scanf-et, csak kérdés mi módon.
- A hozzászóláshoz be kell jelentkezni
1-2 esetet meg illene lekezelned, pl. EOF.
- A hozzászóláshoz be kell jelentkezni
OK!
De ebben az esetben nem láttam szükségét, mivel az EOF értéke -1 és az sem egyenlő 1-el. Itt az kellene, hogy újra próbálja a bekérést. Ahhoz meg nem feltétlenül számit. A kívánt állapot az amikor pontosan egy változót tud sikeresen beolvasni.
- A hozzászóláshoz be kell jelentkezni
EOF utan mar hiaba olvasgatsz tovabb... garantalt a vegtelen ciklus.
- A hozzászóláshoz be kell jelentkezni