Labor, 9. hét: dinamikus tömbök II.
Czirkos Zoltán, Pohl László · 2025.10.31.
Dinamikus tömbök kezelése, sztringek dinamikus tömbökben.
Felkészülés a laborra:
- A pointerekről és sztringekről szóló előadás átismétlése.
- A dinamikus memóriakezelésről szóló előadás anyagának megértése.
A debugmalloc használata a házi feladatnál követelmény, ezért szokj hozzá laboron is, hogy minden dinamikus memóriakezelést igénylő feladatnál használd a továbbiakban! Sok, másként nehezen fellelhető hiba megtalálásában segít.
Gyakran látni nagyobb programokban az strdup() nevű függvényt. Ez nagyon sokáig nem volt szabványos, de szinte
mindenki megírja magának, mert nagyon hasznos. A feladata az, hogy a paraméterként kapott sztringről készítsen egy
másolatot, amelyiket dinamikusan foglalt területre tesz. A másolat helyét, azaz a dinamikusan foglalt karaktertömb
címét visszatérési értékként adja, és természetesen később fel kell szabadítani azt.
- Írj
masolat()nevű függvényt, amelyik ugyanígy működik! Például azstr = masolat("alma")sor hatására jöjjön létre a kért másolat, és kerüljön be annak címe azstrpointerbe. - Írj megjegyzést a függvény fölé, amelyben pár mondatban leírod, hogyan kell azt használni! (A nagy házi feladatban is minden függvényt dokumentálnod kell majd.)
- Mutass példát a függvény használatára! Ne feledkezz meg benne a tömb felszabadításáról!
Tipp
Figyeld meg jól a feladatkiírás str = masolat("alma") kifejezését! Ebben a függvényhívás után egy
értékadás történik: az str = ... kifejezésrészlet egy pointert tárol el. Ez az a pointer, amelyik
a függvény által lefoglalt területre mutat. Fontos, hogy itt nem sztring értékadás történik, azaz nem tömbök
közötti értékadás; egyszerűen csak egy pointert ráállítunk a létrejött tömbre.
A string.h fájl strcat() függvénye sztringek összefűzésére való: az strcat(x, y) hívás
az x pointer által mutatott sztring végéhez fűzi az y sztringet. Ehhez az x által
mutatott tömbben elegendő helynek kell lennie, különben a függvény túlindexel. A helyet a hívónak kell biztosítania, ami
azért is kényelmetlen, mert neki is bajlódnia kell a sztringek hosszával, karaktertömbök méretével.
A mostani feladatod egy okosabb függvényt írni. Ezt x = hozzafuz(x, y) formában kell majd
használni. A dolga az, hogy egy meglévő, dinamikusan foglalt x sztringet nyújtsa meg akkorára, hogy
az y is hozzáfűzhető legyen, és tegye is meg a hozzáfűzést. Például:
char *x = masolat("alma"); /* az előző feladatból */
x = hozzafuz(x, "fa");
printf("%s\n", x); // almafa
free(x);
Írd meg a függvényt! Tegyél megjegyzést fölé, amelyben leírod, mire való, és hogyan kell használni! Ügyelj arra, hogy ez a függvény első paramétereként csak dinamikusan foglalt sztringet kaphat – ezt megemlítheted a megjegyzésben is.
Tipp
Vajon miért kell a függvénynek visszatérnie a dinamikusan foglalt terület címével? Azért, mert az átméretezés során
megváltozhat a memóriaterület helye a memóriában. Lehet, hogy az eredeti helyen nem fér el a nagyobb tömb, és
új jön létre, nagyobb mérettel. Az eredeti tömb pedig eltűnik, felszabadítja azt a függvény! Az előadáson már
találkoztál ezzel a realloc() függvény
kapcsán.
Írj függvényt, amely egy sztringet kap, és kivágja abból a paraméterként kapott két index közötti részt! Az első index az első olyan karakterre mutat, ami már kell, a második index pedig az első olyanra, ami már nem. Tehát balról zárt, jobbról nyílt intervallumról van szó. Ha az első index kisebb 0-nál, akkor vegye a függvény 0-nak azt; ha a második nagyobb a sztring hosszánál, akkor pedig azzal megegyezőnek. Térjen vissza a függvény egy dinamikusan foglalt sztringgel, amelyik a kivágott részt tartalmazza!
Írj teszt programrészt is – próbáld ki a függvényt különböző bemenetekre! Pl. így:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| h | e | l | l | o | , | v | i | l | a | g |
Ne feledkezz meg a függvény fölé, megjegyzésben írt dokumentációról! Mire jó a függvény? Milyen paraméterei vannak? Milyen kötelezettségei vannak a hívónak?
Írd meg az előző feladat függvényét fordítva: az indexekkel jelzett részt a függvény hagyja el, csak a többi maradjon! Az eredeti sztring itt is legyen változatlan, a függvénynek egy új sztringet kell előállítania.
A visszatérési érték ugyanúgy legyen egy dinamikusan foglalt sztring. Mutass példát a függvény használatára! Ne felejtsd el a kapott dinamikus tömböt felszabadítani!
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| h | e | l | l | o | , | v | i | l | a | g |
Írd meg a szokásos megjegyzést a függvény fölé! Mire való? Hogyan kell paraméterezni? Kell a hívónak is emlékeznie valamire?
A feladat az eddigiekhez hasonló: a függvény sztringeket kap, és egy új sztringet kell előállítania.
Most azonban nem kivágni kell egy darabot a sztringből, hanem beszúrni valahova egy új részletet.
Például a beszur("hello!", 5, ", vilag") hívás eredménye a hello, vilag!
sztring kell legyen: az o betű és a felkiáltójel közé lett beszúrva a másik sztring.