Hirdetés
- Vezeték nélküli fülhallgatók
- Xiaomi Mi Box androidos médialejátszó 4K és HDR támogatással
- VR topik (Oculus Rift, stb.)
- Ventilátorok - Ház, CPU (borda, radiátor), VGA
- Számos VGA kihalhat a memóriapánik miatt
- AMD vs. INTEL vs. NVIDIA
- A Dbrand megfejtette mi hiányzik a Steam Machine-ről
- Mini PC
- Kompakt vízhűtés
- Házi hangfal építés
Ú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!
- GoodSpeed: 3I/Atlas: Üstökös vagy idegen civilizáció űrhajója?
- Vezeték nélküli fülhallgatók
- Konzolokról KULTURÁLT módon
- Okos Otthon / Smart Home
- Xiaomi Mi Box androidos médialejátszó 4K és HDR támogatással
- Elektromos autók - motorok
- VR topik (Oculus Rift, stb.)
- gban: Ingyen kellene, de tegnapra
- BestBuy ruhás topik
- Spórolós topik
- További aktív témák...
- Gigabyte GeForce 760 4 GB -os VGA kártya ! aKCIóó!
- Apple iPhone 13 Pro / 128GB / Kártyafüggetlen / 12Hó garancia / Akku : 100%
- ÚJ Lenovo LOQ 15AHP10 - 15.6"FHD 144Hz - Ryzen 7 250 - 16GB - 1TB - Win11 - RTX 5050 - 3 év garancia
- Érintő képernyős Dell Latitude 5547 (4. gen.i7, 2 GB Radeon VGA, 240 SSD ,16 GB) olcsón!!!! AkciÓÓ!
- Zenbook S 16 UM5606WA 16" 3K OLED Ryzen AI 9 HX370 890M 32GB 1TB IR kam gar
- GYÖNYÖRŰ iPhone 12 Pro Max 128GB Pacific Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS3938, 100% Akku
- HP Thunderbolt 4 kábel
- BESZÁMÍTÁS! 4TB Western Digital RED Pro SATA HDD meghajtó garanciával hibátlan működéssel
- Jo Nesbo: LEOPÁRD (nem olvasott)
- Xbox Series X 1 TB + kontroller 6 hó garancia, számlával!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopműhely Bt.
Város: Budapest



