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

1. Próba ZH

Ha még nem vitted föl a gyakorlaton írt próba ZH pontszámát, tedd meg!

2. Sztring dinamikus másolata

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 az str = masolat("alma") sor hatására jöjjön létre a kért másolat, és kerüljön be annak címe az str pointerbe.
  • Í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.

3. Dinamikus sztring nyújtása

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.

4. Részsztring előállítása

Í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?

5. Sztring darabjának elhagyása

Í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?

6. Sztring beszúrása

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.

7. További feladatok

Ha elkészültél, folytasd a feladatgyűjtemény kapcsolódó feladataival!