Programozás I. - 9. gyakorlat Sztringkezelés, mutatók Tar Péter 1 Pannon Egyetem M szaki Informatikai Kar Rendszer- és Számítástudományi Tanszék Utolsó frissítés: November 2, 2009 1 tar@dcs.vein.hu Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 1 / 25
1 Sztringek Deníció Értékadás és karakterhivatkozás 2 Sztringkezel függvények Bekérés és kiírás Fontosabb m veletek 3 Mutatók Deníció, alapok Mutatók és mutatott értékek Többszörös indirekció Mutató aritmetika 4 Cím szerinti paraméterátadás 5 Feladatok Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 2 / 25
Sztringeek - ismétlés Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 3 / 25
Sztringek Deníció A sztring olyan karaktertömb, amelyben a karakterek sorozatát a 0 érték karakter zárja. Tárolás char s[]; char s[10]={'a','b','c','\0'}; char s[]="abcde"; char* sp="mutatott sztring"; //Eltér az el z ekt l Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 4 / 25
Stringek értékadása Tömb esetén char s[]="abc"; s="cba" //Hibás szintaxis Az értékadás sztringkezel függvények segítségével valósítható meg. Mutató esetén char* sp="egyik"; sp="masik"; //Helyes értékadás Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 5 / 25
String literálok összef zése, karakterekre hivatkozás Literálok összef zése char s[]="abc" "def"; //char s[]="abcdef"; Ekvivalens a két szintaktika, a literálok között bármilyen whitespace lehet. A sztringekben lév vezérl karakterek csak a részsztringben érvényesek! Karakterre hivatkozás char s[]="abcdef"; A harmadik karakter tömb szintaktikával: s[2] A harmadik karakter mutató szintaktikával: *(s+2) Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 6 / 25
Sztringkezel függvények Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 7 / 25
Sztringkezel függvények A sztringek kezelésére alkalmas függvények a sztring.h header le-ban találhatók. Minden sztringkezel függvény használatakor be kell tölteni (#include<>). Ebben az állományban számos függvény található sztringek összehasonlítására és módosítására. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 8 / 25
Bekérés, kiírás I. char* gets(char* s) Sor bekérésére alkalmas függvény A kapott char* által mutatott címre egy sort olvas be Visszatérési értéke a buer címe int puts(const char* s) Sor kiírására alkalmas függvény A kapott sztringet kiírja a képerny re Visszatérési értéke a kiírt karakterek száma Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 9 / 25
Bekérés, kiírás II. int sscanf(char* in,const char* format[, arguments]) String bekérésére alkalmas függvény A kapott char* in tömbb l olvas A formázó sztring megadása megegyezik a scanf-nél tanultakkal int sprintf(char* out,const char* format[, arguments]) String kiírására alkalmas függvény A kapott char* out tömbbe történik a kiírás A formázó sztring megadása megegyezik a printf-nél tanultakkal Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 10 / 25
Másolás, összef zés, hossz meghatározása char* strcpy(char* dest,const char* src) Az src sztringet a dest-be másolja Visszatérési értéke a dest mutatója char* strcat(char* dest,const char* src) Az src sztringet a dest-hez f zi Visszatérési értéke a dest mutatója size_t strlen(const char* src) Visszaadja a sztring hosszát a karakterek számában Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 11 / 25
Keresés, összehasonlítás char* strchr(const char* src, int c) Megkeresi src-ben a c karakter els el furdulási helyét, erre mutató pointert ad vissza char* strcmp(const char* str1,const char* str2) Összehasonlítja a két sztringet: str1<str2 A visszatérési érték negatív str1=str2 A visszatérési érték nulla str1>str2 A visszatérési érték pozitív char* strspn(const char* str1,const char* str2) str1 els olyan pozíciójával tér vissza, amely str2-ben nem található char* strstr(const char* str1,const char* str2) str2 els el fordulását keresi meg str1-ben található. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 12 / 25
Egyéb sztringkezelé függvények Számos más sztringkezel függvény is létezik, illetve az el bbiek módosításai. Ezek egy része megtalálható az el adásanyagban, a teljes lista a referenciakönyvekben, vagy a weben. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 13 / 25
Mutatók Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 14 / 25
Mutatók (Pointerek) Deníció A mutatók olyan változók, melyek más változók, vagy objektumok címét tárolják. Jellemz i Hossza 4 bájt (Ekkora egy memóriacím) Használatához az indirekció operátora (*) szükséges A memóriában bármire mutathat A NULL érték logikailag hamisat jelent. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 15 / 25
Mutatók létrehozása Szintaxis [tárolási osztály] mutatotttípus* pnev=null; További jellemz k A mutatott érték típusa el re meghatározott Létrehozáskor a mutatókat mindig célszr inicializálni Deklarációnál minden mutató el tt szerepelnie kell a * karakternek A * a mutató neve és típusa között bárhol szerepelhet Univerzális mutató (void*) Bármire mutathat, használat el tt a megfelel típusúra kell konvertálni. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 16 / 25
Mutatók és mutatott értékek Mutató értéke A mutató értéke egy memóriacím. Mutatott érték A mutatott értéket a mutató típusa alapján a * operátorral olvashatjuk ki. Az eredmény a mutató értékében tárolt memóriacímen lév adat értéke lesz. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 17 / 25
Mutatók értékadása Címképzés A mutatók értékeként bármely változó címét megadhatjuk a & operátor segítségével. Veszélyek A használaton kívüli mutatókat mindig állítsuk NULL értékre Egy mutató használata el tt ellen rizzük, hogy NULL érték -e Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 18 / 25
Többszörös indirekció A mutató is egy változó, az is egy memóriacímen helyezkedik el, így annak a címére is hivatkozhatunk egy mutatóval. Szintaxis int x=1; int* px=&x; int** ppx=&px; Tulajdonságai Az indirekció tetsz leges mélységig növelhet A mutatott értékre való hivatkozásnál minden * operátor egyel csökkenti az indirekció mélységét Használata: pl.: Több dimenziós tömbök kezelése Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 19 / 25
Mutató aritmetika M veletek mutatókkal pointer + int = pointer A hivatkozott memóriacím után elhelyezked objektumok címét adja meg pointer - int = pointer A hivatkozott memóriacím elött elhelyezked objektumok címét adja meg pointer - pointer = int Két azonos típusú mutató esetén, a köztük elhelyezked objektumok számát adja meg Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 20 / 25
Függvények Paraméter átadási módok Érték szerinti paraméterátadás - A paraméterek értékei lemásolódnak Cím szerinti paraméterátadás - A paraméterek mutatók! Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 21 / 25
Cím szerinti paraméterátadás Tulajdonságok Az indirekció segítségével megcímezhetünk változókat Helyes használat esetén módosíthatjuk a függvényen kívüli változók értékeit Eddig visszatérési értékként egy értéket tudtunk csak adni, ez most is igaz, de a függvény több küls változóra is hatást gyakorolhat. Figyelni kell rá, hogy mindig memóriacímet adjunk át, ha cím szerinti paraméterátadást szeretnénk használni. Ellen rizzük hogy a mutató értékünk nem NULL-e, egyébként hibát kaphatunk. Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 22 / 25
Példa Példa Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 23 / 25
1 Kérjünk be egy 5x5-ös tömböt Készítsünk csere függvényt, amely megcserél két elemet Rendezzük soronként az elemeit Írjuk ki az egyes oszlopokban az elemek maximumát Használjunk cím szerinti paraméterátadást, ahol lehetséges 2 Kérjünk be négy számot Készítsünk egy valtoztat nevü függvényt, amely egy számot véletlenszer en vagy eggyel növel, vagy eggyel csökkent Készítsünk egy mindet_valtoztat nevü függvényt, amely mind a négy számot változtatja Készítsünk egy függvényt, ami addig változtatja a számokat, míg az egyik 0 nem lesz (minden lépésben írjuk ki az aktuális értékeket) Használjunk cím szerinti paraméterátadást, ahol lehetséges Tar Péter (PE-MIK-DCS) Programozás I. - 9. gyakorlat November 2, 2009 24 / 25