C string műveletek (string.h alkalmazása)

Hasonló dokumentumok
Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

Pénzügyi algoritmusok

Programozás I gyakorlat. 10. Stringek, mutatók

7/8. gyakorlat Karaktertömbök és sztringkezelés

Programozás C nyelven (10a. ELŐADÁS) Sapientia EMTE

Programozás C nyelven (10. ELŐADÁS) Sapientia EMTE

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

5. gyakorlat. Konstansok Tömbök Stringek

Szövegek C++ -ban, a string osztály

Járműfedélzeti rendszerek II. 5. előadás Dr. Bécsi Tamás

Programozás I gyakorlat

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

Karakter- és sztringkezelő függvények, matematikai függvények

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

10. gyakorlat Tömb, mint függvény argumentum

Példák tematikus csoportosításban

C memóriakezelés. Mutató típusú változót egy típus és a változó neve elé írt csillag karakterrel hozhatjuk létre.

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

malloc free malloc free int sum(int a[4]) { return a[0] + a[1] + a[2] + a[3]; }

1. Alapok. Programozás II

Programozás alapjai. 5. előadás

Programozás alapjai 9.Gy: Struktúra 2.

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Programozas 1. Strukturak, mutatok

7. fejezet: Mutatók és tömbök

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

3. Osztályok II. Programozás II

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás II. 4. Dr. Iványi Péter

Példatár a Programozás 1 tárgyhoz

Programozás C++ -ban 2007/1

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

Programozási segédlet

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Sztringkezelő függvények. A string típusú változók kezelése, használata és szerepük a feldolgozás során

Programozás II. 2. Dr. Iványi Péter

Bevezetés a C++ programozási nyelvbe

8. gyakorlat Pointerek, dinamikus memóriakezelés

Java II. I A Java programozási nyelv alapelemei

Preprocesszor. Programozás alapjai C nyelv 11. gyakorlat. Makrók (2) Makrók (#define) Makrók (3) #include

Programozás alapjai C nyelv 11. gyakorlat. Preprocesszor. Makrók (#define)

tétel: különböző típusú adatokat csoportosít, ezeket egyetlen adatként kezeli, de hozzáférhetünk az elemeihez is

Objektum Orientált Programozás IV.

Java II. I A Java programozási nyelv alapelemei

Bevezetés a programozásba I.

Programozás 6. Dr. Iványi Péter

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

Programozás C++ -ban

Programozás 5. Dr. Iványi Péter

Programozás C és C++ -ban

Programozási Nyelvek: C++

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Programozás alapjai 1. (BMEVIEEA100)

Mutatók és mutató-aritmetika C-ben március 19.

Maximum kiválasztás tömbben

1. Jelölje meg az összes igaz állítást a következők közül!

Programozás I. 5. Előadás: Függvények

Programozás I. gyakorlat

Objektumorientált Programozás IV.

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás II gyakorlat. 6. Polimorfizmus

Programozás C és C++ -ban

Programozás I gyakorlat

Objektumorientált Programozás VI.

C# gyorstalpaló. Készítette: Major Péter

INFORMATIKA javítókulcs 2016

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Programozás alapjai 8.Gy: Program struktúra

Programozás I gyakorlat

Programozás II. Fájlkezelés

A C programozási nyelv III. Pointerek és tömbök.

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

A C programozási nyelv III. Pointerek és tömbök.

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

10. gyakorlat. Pointerek Tárolási osztályok

Programozási nyelvek Java

500. CC Megoldó Alfréd CC 500.

Programozás I. gyakorlat

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

5. Gyakorlat. struct diak {

C++ programozási nyelv Konstruktorok-destruktorok

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

1. feladat. Keresse meg, hogy kik teljesítették a legtöbb kreditet, kiknek a legrosszabb az átlaguk, kik a legfiatalabbak, stb.

Informatika terméktervezőknek

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Adatszerkezetek és algoritmusok

INFORMATIKA tétel 2018

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Smalltalk 2. Készítette: Szabó Éva

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Alprogramok, paraméterátadás

Átírás:

C string műveletek (string.h alkalmazása) A 3. előadás ZH során a string.h-ban található függvények alkalmazásával kell különböző, string kezeléssel kapcsolatos feladatokat megoldani. Ehhez szükséges ezen függvények ismerete, valamint előfordulhat, hogy a feladat végrehajtásához új karaktertömb létrehozására is szükség lesz. Segédanyag Kiváló segédanyag: http://www.cplusplus.com/reference/cstring/ A soron következő példák javarészt innen származnak. Ennél részletesebb, de kevésbé átlátható anyag: http://www.nongnu.org/avr-libc/user-manual/group avr string.html (str -rel kezdődő függvényeket érdemes lehet átnézni) C string (Remélhetőleg mindenki tudja ) C-ben a stringek gyakorlatilag karaktertömbben vannak tárolva. A hasznos karakterek végét egy \0 (null) karakter jelzi. (Így a string kezelő ciklusok általában addig mennek végig a stringen, amíg egy \0 karakterig (tehát a szöveg végéig, nem feltétlenül a tömb végéig) el nem jutnak) Karaktertömb használata #include <string.h> #include <stdlib.h>...... //malloc-hoz char str1[128] = "asdf"; //létrehozunk fix méretű karaktertömböt char str2[] = "Sample string"; //ha így hozunk létre stringet, létrejön egy karaktertömb, melynek akkora a mérete, hogy ez a megadott string elfér benne char* str3 = (char*) malloc(sizeof(char) * 10); //10 elemű karaktertömb dinamikus létrehozása (C++-ban new utasítással is lehetne)

Fontosabb string.h függvények Próbálom összeszedni azokat a függvényeket, melyek szóba jöhetnek a ZH-n, ez azonban nem garancia arra, hogy csupán ezek ismerete elegendő minden feladat tökéletes megoldásához! Ezért mindenki nézze át a string.h függvényeit a fent linkelt oldalakon. Minden példához vegyük úgy, hogy include-oltuk a <string.h> -t (és esetlegesen az <stdio.h>-t), csak az egyes kódrészletek fognak itt szerepelni, nem az egész forráskód. n-es függvények Több string.h függvény rendelkezik egy n -es változattal is. Ezeket összevonva írom csak le. Az n -esek ugyanazt csinálják, mint a simák, csak legfeljebb n karakterig Pl. a 2. (strncpy) függvényben. 1. strlen : string hossza size_t strlen ( const char * str ); Visszaadja a paraméterül kapott string méretét. Nem a karaktertömb teljes méretét, csupán azt, hogy a benne lévő string hány karakter hosszú (hány karakter van a stringet lezáró \0 karakter előtt). char str[100] = "Ez egy string"; int length = strlen(str); printf("a string hossza: %d\n", length); A string hossza: 13

2. strcpy strncpy : string másolása char * strcpy ( char * destination, const char * source ); Egy karaktertömb tartalmát egy másikba másolja. A másolandó karaktertömb összes karakterét átmásolja egészen a \0 karakterig (természetesen a cél tömbben tárolt string végére is \0 karakter kerül). Első paramétere a cél karaktertömb. Második paramétere a forrás karaktertömb. Fontos! A cél karaktertömbnek akkorának kell lennie, hogy abban elférjen a forrás string. Ha nem így van, túlindexelődik char str2[40]; strcpy (str2,str1); printf ("str1: %s\nstr2: %s\n",str1,str2); str1: Sample string str2: Sample string char * strncpy ( char * destination, const char * source, size_t num ); Hasonló az előzőhöz, de legfeljebb n db karaktert fog átmásolni. Az előzővel ellentétben a cél tömbbe került string végére NEM kerül automatikusan \0 karakter! Első két paraméter ugyanaz, mint az előzőnél. Harmadik paraméterben megadhatjuk, hány db karaktert akarunk legfeljebb átmásolni. char str2[40]; strncpy (str2, str1, 5); str2[5] = '\0'; //le kell zárnunk '\0' karakterrel, ugyanis strncpy-nél nem kerül be automatikusan a '\0' a string végére printf ("str1: %s\nstr2: %s\n",str1,str2); str1: Sample string str2: Sampl

3. strcat strncat : string összefűzés char * strcat ( char * destination, const char * source ); Összefűz két stringet. Első paraméterben a cél karaktertömböt, másodikban a hozzáfűzendő karaktertömböt kell megadnunk. Az első paraméterben lévő string végéről törli a \0 karaktert, hozzáfűzi a 2. paraméterben lévő karaktersorozatot, majd a legvégére tesz egy \0 karaktert. Ahogy az strcpy-nél, itt is figyelni kell arra, hogy a cél karaktertömbben elférjen a két string! Ha nem fér el, túlindexelés lesz char str2[40] = "Destination "; strcat(str2, str1); printf ("str1: %s\nstr2: %s\n",str1,str2); str1: Sample string str2: Destination Sample string char * strncat ( char * destination, const char * source, size_t num ); Ugyanaz, mint az előző, de csak n db. karakterig fűzi hozzá a stringet a másikhoz. (Az előző n-es strcncpy függvénnyel ellentétben itt nem kell külön kiraknunk a \0 karaktert) char str2[40] = "Destination "; strncat(str2, str1, 5); printf ("str1: %s\nstr2: %s\n",str1,str2); str1: Sample string str2: Destination Sampl

4. strcmp strncmp : string összehasonlítás int strcmp ( const char * str1, const char * str2 ); Összehasonlítja két string tartalmát, karakterenként. Ha a két string tartalma azonos, 0-val tér vissza. 0-nál nagyobb értékkel tér vissza, ha a két string első eltérő karaktere közül az első stringben nagyobb a karakter (magyarul az első string eltérő karaktere hátrébb van az ascii táblában, mint a második stringé). 0-nál kisebb az érték különben. char str2[40] = "Samplf string"; int cmp = strcmp(str1, str2); if (cmp == 0) { printf("a ket string egyforma\n"); else if (cmp > 0) { printf("str1 a 'nagyobb'\n"); printf("str2 a 'nagyobb'\n"); str2 a 'nagyobb' int strncmp ( const char * str1, const char * str2, size_t num ); Ugyanaz, mint az előző, de legfeljebb n karakterig vizsgálja a két stringet. char str2[40] = "Samplf string"; int cmp = strncmp(str1, str2, 5); if (cmp == 0) { printf("a ket string egyforma\n"); else if (cmp > 0) { printf("str1 a 'nagyobb'\n"); printf("str2 a 'nagyobb'\n"); A ket string egyforma

5. strchr strrchr : karakter keresés stringben const char * strchr ( const char * str, int character ); Megkeresi egy karakter első előfordulását a stringben. Első paraméter a string. Második paraméter a keresett karakter. Karakter pointer-t fog visszaadni, mely a megtalált karakterre mutat. Ha nem talált ilyen karaktert a stringben, null pointert fog visszaadni. char str1[] ="sample string"; char* c = strchr(str1, 's'); if (c!= NULL) { int index = c - str1; //a két címet kivonva egymásból megkapjuk, hanyadik indexen volt eredetileg a karakter printf("a megtalalt karakter a %d. indexen van\n", index); printf("nem talalhato a karakter"); A megtalalt karakter a 0. indexen van const char * strrchr ( const char * str, int character ); Hasonló az előzőhöz, de nem az első, hanem az utolsó előfordulását keresi meg a karakternek! char str1[] = "sample string"; char* c = strrchr(str1, 's'); if (c!= NULL) { int index = c - str1; //a két címet kivonva egymásból megkapjuk, hanyadik indexen volt eredetileg a karakter printf("a megtalalt karakter a %d. indexen van\n", index); printf("nem talalhato a karakter"); A megtalalt karakter a 7. indexen van

6. strstr : substring keresése char * strstr (char * str1, const char * str2 ); Hasonló az strchr-hez, azonban nem egy karakter előfordulását, hanem egy string előfordulását (substring) keres egy másik stringben. Az első paraméter a string, amelyben keresünk. A második paraméter a keresett string. Karakter pointerrel fog visszatérni, mely NULL, ha nem találta meg a substringet. Különben rámutat a substring kezdő karakterére. char str[] ="This is a simple string"; char * c; c = strstr (str,"simple"); //"simple" stringet keresünk if (c!= NULL) { //Ha megtaláltuk a substringet, kicseréljük "sample"-ra! //Gyakorlatilag a megtalált pointer helyére bemásoljuk a "sample"-t, ezzel felül is írjuk az eredeti "simple"-t strncpy (c,"sample",6); printf("nem talalhato a substring!\n"); printf("%s\n", str); This is a sample string

7. strrev : string megfordítása char* strrev(char* s) Megfordítja egy string tartalmát. Paraméterül a megfordítandó stringet kell megadnunk. Visszatérési értéke a megfordított string kezdetére mutató karakter pointer. char str1[] = "Vajon ez egy palindroma?"; char str2[] = "indulagorogaludni"; printf("%s\n%s\n\n", str1, str2); strrev(str1); strrev(str2); printf("%s\n%s\n", str1, str2); Vajon ez egy palindroma? indulagorogaludni?amordnilap yge ze nojav indulagorogaludni

8. strset strnset : karakterek beállítása megadott karakterre char *strset( const char *str, char ch ); Egy string összes karakterét egy megadott karakterre állítja. Első paramétere a string. Második paramétere a karakter, melyre állítani szeretnénk a string összes karakterét. Visszatérési értéke egy karakter pointer, mely a string kezdetére mutat. char str1[] ="sample string"; printf("%s\n\n", str1); strset(str1, 'x'); printf("%s\n", str1); sample string xxxxxxxxxxxxx char *strnset(char *string, int c, size_t n); Ugyanaz, mint az előző, de csak n db karaktert fog átállítani. Példa feladat (az eddigi példákon felül!): http://www.inf.u-szeged.hu/~ihorvath/teaching/prog2/zh/stringmuveletek.cpp + A 2. gyakorlatomon néztünk pár példát, ezt érdemes átnézni, főleg a palindroma vizsgáló függvényt (nem tökéletes, de azért sok mindent lekezel, ZH-ban azért ilyen szintűre nem kell számítani): http://www.inf.u-szeged.hu/~ihorvath/teaching/prog2/2/string_muveletek.cpp