Új hozzászólás Aktív témák
-
Jester01
veterán
válasz
Rickazoid
#3085
üzenetére
Az i nem feltélten lesz 0. Egyszerűen csak nem változik az értéke. Mivel te semmivel sem inicializáltad, véletlen érték lesz, ami éppen a memóriában volt. Feladattól függően egyébként sem biztos, hogy a 0 hibás bevitel lenne.
Azért végtelen a ciklus mert ha a scanf elakad, akkor nem olvassa ki a pufferből a maradékot. A következő scanf hívás tehát pont ugyanúgy elakad. Neked kell takarítani, a következő sorvég jelig, például getchar használatával. EOF-ot is illik lekezelni.
A scanf amúgy visszaadja mennyi mezőt sikerült beolvasnia, de ettől még lehet szemét a pufferben. Nem véletlenül mondják, hogy nem ajánlott scanf-et használni. Bármennyire is nem szeretnéd, a korrekt megoldás általában teljes sor olvasása (fgets) után kézi feldolgozás (strtol, strtod).
-
-
Jester01
veterán
válasz
Rickazoid
#2895
üzenetére
Igen, pár változó maradt ki. Ami jelen esetben (is) nagyon fontos volt mivel a típusuk, a méretük és a sorrendjük nagyban befolyásolhatja a program működését. Igen, kitaláltam nagyjából mik lehettek.
"Ezen felül, a buffer2 és buffer3 tömbök induláskor nincsenek inicializálva"
Ez nem is tudom mit jelent.Azt jelenti, hogy C-ben a lokális változók tartalma induláskor nem definiált. Tehát bármi lehet benne. Ezért rossz, ha te valamit keresel benne.
Az általam tanultak szerint a while(Name[I][l]=buffer3[l++]); kifejezés megfelelő.
Nem az, mivel a szabvány szerint nem szerepelhetne benne l és l++ is. A működése ugyanis attól függ, melyik értékelődik ki hamarabb és ezt a szabvány nem definiálja. Ha a jobb oldal számítódik ki először, akkor oda az l eredeti értéke helyettesítődik, de a bal oldalra már a növelt érték kerül. Fordított sorrendben mindkét helyre az eredeti érték kerül.
kellett valami, ami kinullázza a tömb tartalmát
Tehát a tömböt akarod kinullázni. Van neki mérete, tessék szépen végigmenni rajta és kinullázni. for(l = 0; l <= size; ++l) buffer2[l] = 0; (mivel ugye a tömböd mérete size + 1 volt.
Aki nem a debugger használatát tanítja először fejbe kellene kólintani.
-
Jester01
veterán
válasz
Rickazoid
#2893
üzenetére
Tényleg olyan nagy dolog fordítható, futtatható kóddal megtisztelni a segítőkész embereket?

Valahogy kipótoltam, de hogy így most az-e amit te használsz azt honnan tudjam?
Általános jótanács, hogy kapcsold be a fordító figyelmeztetéseit:
warning: suggest parentheses around assignment used as truth value
warning: operation on 'l' may be undefinedEzek a while(Name[I][l]=buffer3[l++]); sorra vonatkoznak.
Következő jótanács, hogy használd a valgrind (vagy más hasonló) programot. Ez például megmutatja, hogy itt-ott a már bezárt f fájlból akarsz olvasni az ff helyett.
Ezen felül, a buffer2 és buffer3 tömbök induláskor nincsenek inicializálva, tehát legalább az első iterációban baj van. A későbbiekben sem látom hogy kerül bele EOF ami különben is int konstans, tehát char változóba nem szabad beletenni.
Ezeket javítva már valamit csinál a program, de hogy az jó-e azt nem tudtam a leírásodból kibogozni.
-
Rickazoid
addikt
válasz
Rickazoid
#2889
üzenetére
Na jó, arra rájöttem, hogy a szöveg eltárolása getchar() függvénnyel szemantikai hiba miatt nem volt jó, kimaradt egy zárójel: while((name[i][j++]=getchar())!='\n');
És a kiíratás is egyszerűbben megoldható: while(putchar(name[j][k++]));
De mi van a while(getc(stdin)!='\n'){} szükségességével? Ha ezt benne hagyom, félek könnyen veszíthetek egy jegyet (c<='a' helyett c<=97 alakért is kaptam már rosszabbat). -
kingabo
őstag
válasz
Rickazoid
#2745
üzenetére
Ahogy Jester01 ajánlotta sort olvass be, amit az atoi-val (ascci to int) alakíts át számmá és ennek az eredményét vizsgáld a switch-ben. Elötte persze ellenőrizni kell, hogy mit adott vissza az atoi: pl 11a esetén 11-t, a esetén 0-t (de 0 esetén is 0-t ad vissza, ami jó!), ilyenkor nyilván újra be kell kérni.
-
Jester01
veterán
válasz
Rickazoid
#2743
üzenetére
De, a te C kódodat futtattam. Egy debuggert mihamarabb meg kellene tanulnod, mert azzal tudod a saját programhibáidat felderíteni. gdb-ben nagyjából 8 paranccsal kiválóan el lehet boldogulni (break, run, step, next, continue, print, x, exit) vagy használhatsz valamilyen grafikus felületet.
Jelen esetben abba futottál bele, hogy a standard input az soronként pufferelt továbbá a getchar szorgalmasan visszaadja a sorvég jelet is. Én például azt írtam be, 5<enter>. Ezt a gép úgy dolgozza fel, hogy az első getchar hívásnál látja, hogy nincs semmi a bemeneti pufferben, tehát beolvas egy egész sort, majd visszaadja az első karaktert (az 5-öt). Erre lefut a switch-ed majd visszamegy a ciklus miatt a getchar-hoz. Ezúttal viszont van még a pufferben valami, mégpedig a sorvég jel, tehát a getchar nem vár és azt adja vissza. Ez ismétcsak a default ágra jut. Hasonló történik akkor is ha másik ágra futsz, a pufferben még mindig benne lesz a sorvég illetve bármi amit a felhasználó még elé írt. Ezt a következő beolvasás vissza is fogja adni.
Ezért tehát mindig célszerű a teljes sort beolvasni majd igény szerint feldolgozni. Például mi legyen, ha a felhasználó 11-et ír be.
-
Jester01
veterán
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Futás, futópályák
- Xiaomi 15T - reakció nélkül nincs egyensúly
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Milyen billentyűzetet vegyek?
- The Division 2 (PC, XO, PS4)
- Hobby rádiós topik
- Whisky topik
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- Soundbar, soundplate, hangprojektor
- One otthoni szolgáltatások (TV, internet, telefon)
- További aktív témák...
- L13 Yoga Gen3 13.3" FHD+ IPS érintő i5-1245U 16GB 256GB NVMe ujjlolv IR kam aktív toll gar
- Iphone 13 128GB Rózsaszin, Független, 100% új akku, garanciával, üzlet
- I7 9700k + msi Rtx 2080 komplett gép eladó
- L13 Yoga Gen3 13.3" FHD+ IPS érintői5-1245U 16GB 256GB NVMe ujjlolv IR kam aktív toll gar
- Playstation 5 pro és PSVR 2 szett, kontoller töltő állomás minden kontollerhez
- AKCIÓ! Intel Core i9 10900 10mag 20szál processzor garanciával hibátlan működéssel
- BESZÁMÍTÁS! MSI B760M i5 14400 16GB DDR5 512GB SSD RX 6700 XT 12GB Lian LI LANCOOL 207 GIGABYTE 750W
- MEDION ERAZER Cooling Kit V2 Vízhűtés - MD 62737 Beast 16 X1 gamer laptophoz
- 216 - Lenovo Legion Slim 7 (16IRH8) - Intel Core i7-13700H, RTX 4060
- Dell Precision 7550 i7-10850H 64GB 1TB Nvidia RTX3000 6GB 1 év garancia
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

