Vkladáme riadok: #include
Kopírovanie reťazca/slova do reťazca – strcpy( )
Skopíruje konkrétny reťazec, alebo zadané slovo do cieľového poľa znakov. Funkcia je jednoduchá a všeobecný zápis je takýto:
strcpy(cieľ - pole znakov,text alebo premennú typu reťazec);
Príklad:
char str[20];
strcpy(str,"ahoj");
ShowMessage(str);
Reťazec sa však dá pri deklarácii premennej typu pole znakov zapísať do premennej aj iným spôsobom ako touto funkciou. Robí sa to tak, že hranaté zátvorky [] pri deklarácii poľa znakov ponecháme prázdne a prekladač sám spočíta dĺžku reťazca. A zapísanie do tejto premennej urobíme iba zápisom = {“reťazec”}.
Príklad:
char ret[] = {"Programovanie"};
ShowMessage(ret);
Spájanie/pripájanie reťazcov – strcat( )
Táto funkcia funguje tak, že pripojí reťazec alebo text na koniec cieľového poľa znakov. Takže vlastne môžeme do jedného cieľového reťazca/poľa znakov pripájať podľa potreby slová, alebo obsah premenných typu reťazec.
Príklad:
char ciel[40],pom[15]; //premenné char - dve polia znakov
strcpy(pom," C++"); //zapísanie slova do premennej pom
strcpy(ciel,"Programovanie"); //zapísanie slova do premennej ciel
strcat(ciel," v jazyku"); //pripojenie slova na koniec poľa
//znakov ciel
strcat(ciel,pom); //pripojenie premennej obsahujúcej
//reťazec na koniec poľa ciel
ShowMessage(ciel);
Porovnávanie reťazcov – strcmp( ) a strcoll( )
Obe tieto funkcie porovnávajú dva reťazce a zisťujú či sa rovnajú alebo ktorý z nich je “väčší” alebo “menší” z lexikografického hľadiska. Zjednodušene povedané, zistia, či sa rovnajú, a ak sa nerovnajú zistia tieto funkcie ktorý je podľa abecedy prvý v poradí. Obe funkcie pracujú rovnako len strcoll ( ) lokálnych jazykových nastavení, ktoré je možné upresňovať, ale tým sa zaoberať nebudeme. Obe funkcie vracajú nasledovné hodnoty:
Vrátená hodnota:
< 0 reťazec1 je menší ako reťazec2
> 0 reťazec1 je väčší ako reťazec2
0 reťazce sa rovnajú
Všeobecný zápis:
strcmp(reťazec1,reťazec2);
Príklad:
char ret1[20],ret2[20];
int vysl;
strcpy(ret1,"Michal");
strcpy(ret2,"Marek");
vysl = strcmp(ret1,ret2); //priradenie hodnoty funkcie premennej int
//podmienky a výpis výsledku porovnávania
if(vysl == 0){
ShowMessage("Reťazce sú totožné");
}
else{
if(vysl > 0){
ShowMessage("Prvý reťazec je v abecede druhý");
}
if(vysl < 0){
ShowMessage("Prvý reťazec je v abecede prvý");
}
}
Zistenie prvého výskytu znaku v reťazci – strchr ( )
Táto funkcia prehľadáva reťazec a vracia pointer zvyšku prehľadávaného reťazca vrátane hľadaného znaku. Ak nie je zadaný znak nájdený tak funkcia vracia parameter NULL.
Všeobecný zápis:
strchr(reťazec, znak, ktorý hľadáme);
Príklad:
char str[50] = "mama je eva";
char *p;
int a = 0; //premenná reprezentujúca počet písmen
//vyskytujúcich sa v prehľadávanom reťazci
p = strchr(str,'a'); //priradenie premennej výsledok funkcie
while ( p !=NULL) //cyklus, pokiaľ p sa nerovná výsledku,
//že nič nenašlo
{
a++; //zvyšujeme výskyt
p = p+1; //odstráni zo zvyšku reťazca hľadaný znak
//na začiatku
p = strchr(p,'a'); //volanie funkcie s upraveným parametrom
}
ShowMessage(a);
Hľadanie podreťazca v reťazci – strstr ( )
Táto funkcia je nesmierne užitočná, pretože prehľadá daný reťazec a hľadá v ňom výskyt zadaného podreťazca. Funkcia vracia pointer na zvyšok reťazca vrátane hľadaného podreťazca. Ak podreťazec nie je nájdený funkcia vráti NULL.
Všeobecný zápis:
strstr(premenná typu pole znakov/reťazec, hľadaný podreťazec)
Príklad:
char ret[50];
strcpy(ret,"Toto je 29. diel programovania v jazyku C++");
if(strstr(ret,"ahoj") != NULL){ //podmienka AK nájde podreťazec
ShowMessage("našiel som reťazec");
}
else{
ShowMessage("reťazec som nenašiel");
}
Dĺžka reťazca – strlen ( )
Táto funkcia vráti dĺžku reťazca. Dĺžka reťazca je počet písmen v reťazci bez posledného tzv. nulového znaku, ktorý je definovaný ako ‘/0‘.
Príklad:
char ret[30];
strcpy(ret,"Dĺžka reťazca");
ShowMessage(strlen(ret));
Zapísanie na konkrétne miesto v reťazci časť podreťazca – strncat ( )
Táto funkcia už patrí k sofistikovanejším. Umožňuje na koniec jedného reťazca zapísať určitú časť iného reťazca. Takáto metóda sa dá použiť v mnohých funkciách nahradzovania alebo dopĺňania dát.
Všeobecný zápis:
strncat(reťazec1,reťazec2,počet znakov na zapísanie)
Príklad:
char ret1[30], ret2[30];
strcpy(ret1,"Futbal je ");
strcpy(ret2,"dobrý šport");
//číslo 5 vraví, že prvých 5 znakov z druhého reťazca pripojíme
//k prvému reťazcu
strncat(ret1,ret2,5);
ShowMessage(ret1);
Porovnanie pár znakov z jedného reťazca s iným – strncmp( )
Táto funkcia porovnáva prvých n znakov z prvého reťazca s prvými n znakmi druhého reťazca. Funkcia sa dá využiť v širšom triedení, kde je nutné len aby sa pár znakov zhodovalo. Funkcia vracia rovnaké hodnoty ako funkcia porovnávania strncmp ( ).
Všeobecný zápis:
strncmp (reťazec1,reťazec s ktorým chceme porovnávať reťazec1,počet písmen porovnávania od začiatku)
Príklad:
//pole reťazcov, 1. číslo je počet reťazcov, 2. číslo je
//max dĺžka každého z nich
char ret[5][20]={"Michal" , "Marek" , "Martin" , "Marian", "Jozef"};
int n;
for(n = 0; n < 5; n++){
if (strncmp (ret[n],"Ma**",2) == 0){
ShowMessage(ret[n]); //vypísanie každého, ktorý
//spĺňa podmienky
}
}
Prehľadanie reťazca po znaku a zistenie prvého výskytu akéhokoľvek znaku druhého reťazca – strcspn ( ) a strpbrk ( )
V nadpise je ťažké vysvetliť čo tieto funkcie presne robia. Obe prehľadávajú prvý reťazec po jednotlivých znakoch a hľadajú prvý výskyt akéhokoľvek znaku z druhého reťazca. Rozdiel je v tom, čo funkcie vracajú. Funkcia strcspn ( ) vracia dĺžku prvého reťazca, ak nebol žiadny prvok z druhého reťazca nájdený. Inak vracia hodnotu, ktorá reprezentuje prvok poľa – znak prvého reťazca, ktorý označuje pozíciu, kde sa vyskytuje prvý znak nachádzajúci sa aj v reťazci druhom. Funkcia strpbrk ( ) vracia pointer na zvyšok reťazca, ktorý na začiatku obsahuje nájdený znak, ktorý sa nachádza v oboch reťazcoch.
Príklad1 - strcspn ( ):
//ret1 – reťazec v ktorom hľadáme akýkoľvek prvok ret2 (reťazca 2)
char ret1[] = {"Einsteinova 42, Bratislava"};
char ret2[] = {"0123456789"};
int a;
//priradíme premennej a výsledok funkcie, teda pozície prvej zhody
a = strcspn (ret1,ret2);
//výpis je robený trošku inak ako sme zvyknutý, ale tento
//zápis docieli, aby sme premennú a – pozíciu dostali medzi vetu.
ShowMessage(AnsiString("zhoda bola odhalená na ret[") + a + "]");
Príklad2 - strpbrk ( ):
char ret1[] = {"Einsteinova 42, Bratislava"};
char ret2[] = {"0123456789"};
char *a; //zmena nastala pri deklarácii premennej
a = strpbrk (ret1,ret2);
ShowMessage(a);
Zistenie posledného výskytu znaku v reťazci – strrchr ( )
Táto funkcia zistí pozíciu, na ktorej sa hľadaní znak vyskytuje v reťazci naposledy. Vracia pointer, ktorý ukazuje na časť prehľadávaného reťazca, ktorá obsahuje hľadaný znak a zvyšok pôvodného reťazca.
Všeobecný zápis:
strrchr(prehľadávaný reťazec, hľadaný znak);
Príklad:
char ret1[] = {"Einsteinova 42, Bratislava"};
char *a;
a = strrchr (ret1,'s');
ShowMessage(b);
Zistenie dĺžky podreťazca zloženého iba z určených znakov – strspn ( )
Táto funkcia môže v mnohých prípadoch byť odpoveďou na to, čo hľadáme. Dokáže zistiť dĺžku podreťazca v hlavnom reťazci, ktorý je zložený iba zo znakov, ktoré si zadáme do iného reťazca. Za reťazec sa v tomto prípade počítajú určené znaky v hlavnom reťazci, ktoré sú napísané spolu. Funkcia pracuje tak, že vracia počet prečítaných znakov z prvého reťazca, ktoré sa zhodujú z akýmkoľvek znakom druhého dovtedy, kým narazí na nejaký, ktorý sa nenachádza v druhom reťazci.
Príklad:
int i;
char ret1[] = {"1024MB"};
char ret2[] = {"1234567890"};
i = strspn (ret1,ret2); //int i sa rovná dĺžke hľadaného reťazca
ShowMessage(i);
Delenie reťazca/vety na slová – strtok ( )
Túto funkciu iste rady uvítate. Dokáže rozdeliť reťazec obsahujúci viac slov na jednotlivé slová. Pracuje na princípe, že prehľadáva reťazec a hľadá akýkoľvek zadaný znak nachádzajúci sa ako medzera medzi slovami. Môže teda ísť napríklad o znak “ ” alebo “*” alebo niečo iné. Ak chceme volať túto funkciu viackrát, môžeme použiť pri ďalšom volaní parameter NULL a funkcia bude pokračovať v delení reťazca na slová práve v tom reťazci, s ktorým pracujeme. Funkcia vracia pointer na oddelené slovo. Ak už v reťazci nie je čo deliť vracia hodnotu NULL.
Všeobecný zápis:
strtok(reťazec určený na delenie,”znak reprezentujúci medzeru medzi slovami”);
Príklad:
char ret[] = {"Kupil som si novy LCD monitor"};
char *c;
c = strtok(ret," "); //prvé volanie tejto funkcie s parametrom
//reťazca
ShowMessage(c);
while(c != NULL){
c = strtok(NULL," "); //druhé volanie – parameter reťazca
//nahradil NULL
ShowMessage(c);
}
Ešte tento hlavičkový súbor obsahuje 4 funkcie na prácu s bufferom, ale nie je nutné sa nimi veľmi zaoberať. V budúcej časti prejdeme na veľmi širokú kapitolu – triedy pre vstup a výstup v jazyku C++ (iostream). Toto sú už čisto prvky C++, ktoré staré C nemá. Predtým si však ešte povieme o špecialitkách pri práci s reťazcami.