Kezdőoldal » Számítástechnika » Programozás » Miért tűnik el a szöveg az...

Elektromann kérdése:

Miért tűnik el a szöveg az első szó után, és miért nem működik a program, ha nincs szóköz?

Figyelt kérdés

Folytattam a tanulást, és jelenleg az állományok kezelésénél tartok, de megint hibáztam valamit, és nem tudok rájönni, hogy mit :(

A feladat úgy szólt, hogy írjak egy programot, ami bekér egy szöveges állomány nevét, majd a szöveget nagybetűssé írja át, és elmenti egy másik állományban, ami a beolvasott állomány neve + egy n betű néven lesz elmentve, majd írja ki az új állomány tartalmát.

Én így próbáltam megoldani: [link]


A hiba a következő:

Mint ahogy a kérdésben is leírtam, ha van a szövegben szóköz, az azutáni rész eltűnik. Ha nem rakok szóközt, a 35.-36. sorban levő calloc illetve malloc nem fut le, kilép a program.

Meg tudja nekem valami mondani, hogy mi a hiba?



2015. ápr. 13. 19:03
 1/3 anonim ***** válasza:

A probléma az, hogy nem érted pontosan mit is csinál a malloc. De haladjunk sorban.


6. sor. A main így néz ki:

int main(int argc, const char *argv[]).

Ez majd akkor lesz érdekes ha paraméterezni is akarod a programodat. Ahogy látod (és írtad is) a main függvény visszatérési értéke int típusú, ami két dolgot jelent a te esetedben. Az első hogy a 50 és 64 sorban lévő " return;" hibás. INT tehát szám. 0-ás visszatérési érték jelenti, hogy a programod rendesen lefutott, > 0 pedig, hogy hiba történt. A második pedig, hogy MINDEN esetben kell visszatérési érték, tehát a program végéről hiányzik neked egy "return 0;".


Most hogy ezt megbeszéltünk haladjunk is tovább.

7-9 sor. Változókat szokás inicializálni (kezdőértékkel ellátni), KÜLÖNÖSKÉPPEN a pointereket. Miért? Azért mert ha véletlenül ezelőtt hivatkozol rá mielőtt tényleges értéket adsz neki nem biztos, hogy azon a ponton fog a programod crashelni. Lehet, hogy átírsz valamit a memóriában ami csak sokkal később és a te pointeredtől teljesen függetlenül fog jelentkezni mint anomália, és utána órákig debuggolhatsz hogy vajon mi is történt.

Tehát FILE *allomany = NULL, *tarol = NULL. Hasonlóan a többi változó is.


11 sor: "olvas = (char *) malloc(sizeof(char));"

Mit is csinálsz a malloc tulajdonképpen? Lefoglal X bájtot a memóriából, ahol X a malloc egyetlen paramétere.

Mit csinál a sizeof? Visszaadja valaminek a méretét természetesen :) Na de minek? Hát a char-nak. Mi a char? Egy CHARakter. Tehát te itt szépen lefoglaltál 1 karakternek elegendő területet.


13-14 sor: Ebbe az 1 karakter méretű változódba beolvasol 1 karaktert a standard inputról, ami majd a fileneved lesz. Biztos ami biztos kiszámolod a méretét is :)

Nem tudom te hogy vagy vele de én általában nem 1 karakteres fileneveket használok, már a DOS is tudta a 8+3-at de tekintsünk el most ilyen "hitvitáktól", legyen 1 karakter az a filenév :)


17. sor: Megnyitod az állományod, ez a copy&paste majdnem jó, kérdés mit csinál az a 't' az fopen 2. paraméterében? (foglalmam sincs, de tegyük fel hogy valami windowsos ínyencség)


Haladjunk mert lassan esteledik.


23.sor: Lefoglalod a szintén 1 karakter méretű területet a szöveg változódnak. Gondolom ez a változó lesz amit majd bufferként használsz. A mai gépekben már elég sok memória szokott lenni, nem kellene vele spórolni :) De persze lehet 1 karakterenként is másolni. Nézzük tovább, nem kötekedem inkább.


24. sor: fscanf(allomany, "%s", szoveg);

Itt már googlizni kellett, hogy tényleg jól emlékszem, de igen. Bemásolom neked is:


"The C library function int fscanf(FILE *stream, const char *format, ...) reads formatted input from a stream."


Az angolul kevésbbé értők számára: Az fscanf függvény egy streamről olvas FORMÁZOTT inputot.

Link: [link]

A végén van példa is. Tehát mire jó a fscanf?

Mondjuk a fileod soraiban nevek vannak:

pl.: "Példa Béla"

(Gipsz urat nem szeretjük!)

Akkor be tudod úgy olvasni, hogy külön változóba a vezeték, és külön változóba a keresz nevet:

pl.: fscanf("%s %s", vezetek_nev, kereszt_nev)

Mivel te ilyet nem akarsz így nem a fscanf függvény kellene használni.

Van helyette fread, elvetemültebbeknek sima read.

link: [link]

Rájönni, hogy hogy kell használni házi feladat.


26 sor: Ez a sor jó lehet. De utána kellene nézni mi az strupr() visszatérési értéke. Ha nem void akkor jó lenne kezdeni vele valamit...esetleg. Szintén házi feladat. (főleg mert soha nem használtam ezt a függvényt és googlehoz már késő van, szerverfarm is aluszik...)


28-29 sor: Izé...mi a... Milyen fordítót használsz te? Vagy nem C-ben programozunk? Mert ha igen akkor változókat a függvény elején kell deklarálni még az első utasítás előtt. Legalábbis mi mindig így csináltuk. Meg különben is. Sok szerencsét egy hosszabb kódban kisilabizálni hogyan is került oda az a "kar".


Na de nézzük ezt a ciklust mert vannak itt még sokkal nagyobb csudák. Deklarálsz 2db int változót. Pontosabban egy int-et és egy int*-ot (). Aztán az int*-ot hasonlítod össze egy karakterrel...izé...szerintem te is érzed, hogy ez így nem kóser. Majd eggyel növeled a "masol" masol értékét. Aztán....(dobpergés)

kar = olvas[masol];

Fogod a szerencsétlen egy karakteredet és értékül adod az intednek. Vagyis adnád. Mivel "masol" itt már 1 és ha jól emlékszem "olvas" csak 1 lett több helyett ez a sor barátok közt is egy segfault aka crash aka " kilép a program".

És szerintem akkor itt álljunk is meg. Mi lenne ha 2 részre osztanád a feladatot. Legyen az első mondjuk az, hogy fileból olvasás, képernyőre kiírás (google: printf).

Ha az már megy, akkor majd hozzákezdhetsz az íráshoz.

Amit még javaslok neked, hogy ne copy&paste módszerrel programozz hanem próbáld megérteni melyik utasítás pontosan mit is csinál, milyen paramétereket vár, mi a visszatérési értéke. Jó szórakozást, és sok szerencsét!

EOF

2015. ápr. 14. 01:41
Hasznos számodra ez a válasz?
 2/3 A kérdező kommentje:

Nem tudom, nálad a malloc() miért csak egy karakter, nálam akár 100-at is beolvas.

Én a közetkezőből tanulom a programozást: [link]

Ebből azt tanultam, hogy a calloc()-al meghatározom, hogy mennyi elemet, és mekkora méretben foglalok, a malloc()-ban pedig csak a méretet foglalom le, a mennyiséget nem. Ennek függvényében, mikor beírtam, hogy az állományom neve "szoveg.txt", akkor létrehozott egy szovegn.txt-t, és a mondatom első szavát el is tárolta benne.


Ahogy olvastam a választ, azt hittem, hogy nem a C-re gondolsz (elvégre elfelejtettem beleírni a kérdésembe), de aztán láttam, mégis egyre gondolunk. Így viszont nem értem, hogy miért nem érted a fopen()-ben azt a második betűt.

"Mindegyik mód jellemző kiegészíthető egy + paraméterrel, ez miden esetben azt jelenti, hogy az állományt olvashatjuk és írhatjuk is. A mód sztringben szoktuk még megadni, hogy milyen

állománnyal dolgozunk. t szöveges, b bináris állományt jelent."

Ezért írtam "rt"-t, mert a tanultak alapján így egy szöveges állományt fog beolvasni.

Azért nem akartam fread-et alkalmazni, mert ott meg kell adni, hogy mennyi karaktert olvasson be, de egy ismeretlen állomány esetében nem tudom, hogy mennyit lehet beolvasni. A pdf szerint az fscanf() hasonló a scanf()-hez, csak fájloknál használjuk. Igaz, a scanf szem képes szóközt beolvasni, azt már a következő scanf-be adja. Ez megmagyarázza a dolgot, hogy miért nem olvassa be a teljes szöveget, de még mindig nem értem, hogy miért jelentkezik hiba, ha nincs szóköz.

2015. ápr. 15. 18:55
 3/3 A kérdező kommentje:

Csak most látom, hogy rossz helyen tettem fel a kérdésem :S

A Programozásban akartam, nem a programban. Ezért mindenkitől elnézést kérek...

2015. ápr. 15. 19:01

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!