scanf -es kérdés

 ( nzmark | 2006. december 4., hétfő - 22:21 )

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?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

már jó régen volt, de ha jól rémlik valahogy így volt:

scanf("%c,%c\n",&x,&y);

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

for (i=0,i<5;i++)

az i=0 után ugye ; van?

persze, csak elgépelés volt

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.

kötött a beolvasási szintaxis
x,y (ahol x a-h;y 1-8)

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?

szerintem olvasd be karakterlanckent es ugy dolgozd fel. en igy csinalnam :)
---
"A legjobb dolgok az életben nem dolgok."

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.

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

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.

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

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.

Í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".

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

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.


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

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.

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?

Ehh, es ebben te hol latsz beolvasast pl. az STDIN-rol?

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.

1-2 esetet meg illene lekezelned, pl. EOF.

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.

EOF utan mar hiaba olvasgatsz tovabb... garantalt a vegtelen ciklus.