STRINGOVI U JEZIKU C
String u jeziku C predstavlja niz podataka tipa char i služi za rad sa tekstom. Definišu se na sledeći način:
char tekst[ ]="Ovo je neki tekst";
ili, može i ovako:
char tekst[]={'O', 'v', 'o', ' ', 'j', 'e', 'n', 'e', 'k', 'i',' ', 't', 'e', 'k', 's', 't', '\0'};
Tip podatka char
Tip podatka char je sličan int podatku, tj. služi za opis celih brojeva, ali zauzima samo 8 bit-a memorije, za razliku od int-a, koji zauzima 16 ili 32 bit-a a može čuvati veći broj.
Tip char se obično koristi za čuvanje znakovnih podataka, odnosno njihovih kodova.
Tako na primer, ako želimo da sačuvamo slovo A u memoriji, čuvali bi zapravo kod slova A. Kodovi karaktera(znakova) su pridruženi brojevi, pomoću kojih razlikujemo karakter.
Npr. kod slova A je broj 65, kod slova B je 66 itd. Vrednost koda možemo dobiti ako karakter stavimo pod apostrofe. npr 'A'.
Primer definisanja koda slova A i njegovo ispisivanje, zajedno sa ispisivanjem karaktera bi bilo:
Tip char se obično koristi za čuvanje znakovnih podataka, odnosno njihovih kodova.
Tako na primer, ako želimo da sačuvamo slovo A u memoriji, čuvali bi zapravo kod slova A. Kodovi karaktera(znakova) su pridruženi brojevi, pomoću kojih razlikujemo karakter.
Npr. kod slova A je broj 65, kod slova B je 66 itd. Vrednost koda možemo dobiti ako karakter stavimo pod apostrofe. npr 'A'.
Primer definisanja koda slova A i njegovo ispisivanje, zajedno sa ispisivanjem karaktera bi bilo:
char ch='A';
printf("Kod slova i slovo: %c %d\n",ch,ch);
printf("Kod slova i slovo: %c %d\n",ch,ch);
Posle pokretanja:
Primer 1: Ispisati tablicu ASCII kodova karaktera
Ispisaćemo kodove karaktera, tako što koristeći for petlju menjamo kodove od 32 do -126 i te vrednosti ispisujemo koristeći konverziju "%c", za ispis karaktera, a "%d" za ispis koda odgovarajućeg karaktera.
Napomena: Kod 127 i kodovi od 0-32 postoje i odnose se na neštampajuće znake, kontrolne i bele znakove. Postoje i znaci sa kodovima veći od 127 a manji ili jednaki 255 i oni zavise od lokalnih podešavanja. Npr. ćirilična slova u određenim područjima itd.
Napomena: Kod 127 i kodovi od 0-32 postoje i odnose se na neštampajuće znake, kontrolne i bele znakove. Postoje i znaci sa kodovima veći od 127 a manji ili jednaki 255 i oni zavise od lokalnih podešavanja. Npr. ćirilična slova u određenim područjima itd.
#include < stdio.h >
#include < stdlib.h >
int main()
{
#include < stdlib.h >
int main()
{
for(int ch=32;ch <= 126;ch++){
return 0;
}
printf("%c %d\n",ch,ch);
}return 0;
Posle izvršenja programa vidimo sledeće:
Učitavanje znakova sa tastature
Učitavanje jednog karaktera(znaka) sa tastature, uključujući i beli znak može se izvršiti pomoću funkcije getchar() iz zaglavlja <stdio.h>.
U istom zaglavlju se nalazi i funkcija koja će ispisati ovaj znak, putchar(ch), gde je ch taj znak.
U istom zaglavlju se nalazi i funkcija koja će ispisati ovaj znak, putchar(ch), gde je ch taj znak.
Ispitivanje znakova pomoću funkcija iz zaglavlja <ctype.h>
Ako želimo da ispitamo vrstu karaktera koji je učitan, možemo koristiti funkcije iz zaglavlja <ctype.h>
Neke funkcije iz zaglavlja "ctype.h"
- isalnum(ch), Da li je ch slovo ili cifra?
- isalpha(ch), Da li je ch slovo?
- islower(ch), Da li je ch malo slovo?
- isupper(ch), Da li je ch veliko slovo?
- isdigit(ch), Da li je ch decimalna cifra?
- isspace(ch), Da li je ch beli znak?
- ispunct(ch), Da li je ch specijalan znak(znak interpunkcije)?
- iscntrl(ch), Da li je ch upravljački znak?
Primer 2: Analiza unete šifre
Napraviti program koji od korisnika zahteva da unese šifru i ispisuje na ekranu koliko ima malih, velikih slova, cifara i
znakova interpunkcije u toj šifri.
znakova interpunkcije u toj šifri.
Za unos šifre koristićemo do-while petlju i funkciju getchar(), da bi unosili znak po znak, a funkcije iz zaglavlja <ctype.h>, za ispitivanje vrste znaka. Kod je prikazan u nastavku:
#include < stdio.h >
#include < ctype.h >
int main()
{
#include < ctype.h >
int main()
{
int sc=0;//broj znakova interpunkcije
int nd=0;//broj cifara
int uc=0;//broj velikih slova;
int lc=0;// broj malih slova
char ch;
printf("Unesite šifru!\n");
do{
printf("Šifra ima %d malih slova, %d velikih slova, %d cifru(cifre) i %d specijalnih
znakova.\n",lc,uc,nd,sc);
return 0;
}
int nd=0;//broj cifara
int uc=0;//broj velikih slova;
int lc=0;// broj malih slova
char ch;
printf("Unesite šifru!\n");
do{
ch=getchar();
if(ispunct(ch)){
if(isdigit(ch)){
if(isupper(ch)){
if(islower(ch)){
}
while(ch!=EOF && (!isspace(ch) && !iscntrl(ch)));if(ispunct(ch)){
sc++;
}if(isdigit(ch)){
nd++;
}if(isupper(ch)){
uc++;
}if(islower(ch)){
lc++;
}printf("Šifra ima %d malih slova, %d velikih slova, %d cifru(cifre) i %d specijalnih
znakova.\n",lc,uc,nd,sc);
return 0;
Učitavanje se vrši sve dok se ne učita beli znak ili neki upravljački znak, npr. nov red, ili se ne učita znak za kraj datoteke(ctrl+Z).
Izvršenje prethodnog primera, vidi se na sledećoj slici:
Izvršenje prethodnog primera, vidi se na sledećoj slici:
Stringovi i pokazivači
Stringovi u C jeziku predstavljaju nizove podataka tipa char koji se mogu kreirati i dinamički, tj. upotrebom pokazivača.
Definišimo dva stringa na sledeći način:
Definišimo dva stringa na sledeći način:
char* pTekst = "Danas je lep dan";
char tekst2[19] = {'A','n','a',' ','v','o','l','i',' ','M','i','l','o','v','a','n','a','\0'};
char tekst2[19] = {'A','n','a',' ','v','o','l','i',' ','M','i','l','o','v','a','n','a','\0'};
Prvi je definisan preko pokazivača(dinamički) a drugi niz je statičan niz podataka tipa char. Oba niza su inicijalizovana nizom karaktera, na dva različita načina, ali u oba slučaja se dobija niz karaktera koji se završavaju sa karakterom '\0'.
Kroz petlju, npr while možemo redom pomerati pokazivač za po jedno mesto i upotrebom operatora(*) "dohvatiti" character na koji pokazuje taj pokazivač, a zatim ispisati character pomoću printf naredbe.
Pokazivač pokazuje na određeni element niza i ako želimo da promenimo da pokazivač pokazuje na sledeći element, to možemo da uradimo jednostavno, inkrementiranjem vrednosti pokazivača, npr. ako napišemo:
pTekst++;
Ovo je dobro objašnjeno u sledećem članku: www.scaler.com/topics/c/string-pointer-in-c/
Da bi imali pokazivač na drugi string dodaćemo sledeći red:
Kroz petlju, npr while možemo redom pomerati pokazivač za po jedno mesto i upotrebom operatora(*) "dohvatiti" character na koji pokazuje taj pokazivač, a zatim ispisati character pomoću printf naredbe.
Pokazivač pokazuje na određeni element niza i ako želimo da promenimo da pokazivač pokazuje na sledeći element, to možemo da uradimo jednostavno, inkrementiranjem vrednosti pokazivača, npr. ako napišemo:
pTekst++;
Ovo je dobro objašnjeno u sledećem članku: www.scaler.com/topics/c/string-pointer-in-c/
Da bi imali pokazivač na drugi string dodaćemo sledeći red:
char* pch2 = tekst2;//pokazivač psh2 pokazuje na prvi element niza tekst2;
Kompletan kod je dat u nastavku:
#include < stdio.h >
int main()
{
int main()
{
char* pTekst="Danas je lep dan";
char tekst2[19]={'A','n','a',' ','v','o','l','i',' ','M','i','l','o','v','a','n','a','\0'};
printf("tekst 1:\t");
while (*pTekst != '\0')
{
printf("\n");
char* pch2 = tekst2;//pokazivač psh2 pokazuje na prvi element niza tekst2;
printf("tekst 2:\t");
while(*pch2 != '\0')
{
printf("\n");
return 0;
}
char tekst2[19]={'A','n','a',' ','v','o','l','i',' ','M','i','l','o','v','a','n','a','\0'};
printf("tekst 1:\t");
while (*pTekst != '\0')
{
printf("%c", *pTekst);
pTekst++;
}pTekst++;
printf("\n");
char* pch2 = tekst2;//pokazivač psh2 pokazuje na prvi element niza tekst2;
printf("tekst 2:\t");
while(*pch2 != '\0')
{
printf("%c",*pch2);
pch2++;
}pch2++;
printf("\n");
return 0;
Ciklus se prekida kada se naiđe na character '\0'.
Posle pokretanja programa može se videti sledeće:
Posle pokretanja programa može se videti sledeće:
Učitavanje stringova u jeziku C
Učitavanje stringa može se izvršiti, osim učitavanja sa getchar(), znak po znak, kako je pokazano u prethodnom primeru i pomoću scanf naredbe, za učitavanje teksta do belog znaka, na sledeći način:
char rec[10];
scanf("%s",&rec);
scanf("%s",&rec);
Da bi učitali ceo red teksta do znaka za nov red, može se koristiti funkcija gets(tekst), a za štampanje učitanog reda puts(tekst) funkcija iz zaglavlja <stdio.h>. U sledećem primeru pokazano je učitavanje teksta, na neki od pomenutih načina.
Primer 3: Učitavanje stringa
Učitati dva stringa, prvi tako da se ucitavanje vrsi do belog znaka(jedna reč), a za unos drugog da se ucita ceo red teksta, sve do znaka za nov red.
Kod je prikazan u nastavku:
Kod je prikazan u nastavku:
#include < stdio.h >
#include < stlib.h >
int main()
{
#include < stlib.h >
int main()
{
char tekst1[10],tekst2[10];
//Ucitavanje sa scanf funkcijom do belog znaka
printf("Unesi tekst\n");
scanf("%s",tekst1);
printf("%s",tekst1);
getchar();//uzima 1 karakter
//ucitavanje karakter po karakter
printf("\nUnesi tekst 2\n");
gets(tekst2);
puts(tekst2);
printf("%s",tekst2);
return 0;
}
printf("Unesi tekst\n");
scanf("%s",tekst1);
printf("%s",tekst1);
getchar();//uzima 1 karakter
//ucitavanje karakter po karakter
printf("\nUnesi tekst 2\n");
gets(tekst2);
puts(tekst2);
printf("%s",tekst2);
return 0;
Određivanje dužine teksta
char tekst[]="Priprema za takmičenje iz programiranja";
int duzina=strlen(tekst);
printf("Dužina teksta je %d\n",duzina);
int duzina=strlen(tekst);
printf("Dužina teksta je %d\n",duzina);
Izdvajanje dela teksta iz teksta(Izdvajanje podstringa)
Deo teksta se može izdvojiti iz celog teksta, tako što se upotrebom petlje prolazi kroz niz podataka tipa char, od pozicije u tekstu odakle treba izdvojiti podstring, pa sve do krajnje željene pozicije i dodavanjem tekućeg znaka u novi niz char podataka, tj. u podstring.
Ovo je pokazano u sledećem primeru:
Ovo je pokazano u sledećem primeru:
Primer 4: Izdvajanje podstringa
Neka je zadat tekst: "Priprema za takmičenje iz programiranja". Izdvojiti deo teksta od pozicije 12, dužine od 10
karaktera i ispisati na ekranu.
karaktera i ispisati na ekranu.
Rešenje: Treba poći od zadatog teksta, a zatim kreirati petlju i postaviti za kontrolnu promenljivu "c" na početnu vrednost jednakoj početnoj poziciji željenog podstringa. Kod je prikazan u nastavku:
#include < stdio.h >
#include < string.h >
int main()
{
#include < string.h >
int main()
{
char tekst[]="Priprema za takmičenje iz programiranja";
int duzina=strlen(tekst);
int poz=12; //podstring počinje od pozicije 12
int duzPodstr=10;
char podstring[duzina];
for(int c = poz,i=0;c <= poz+duzPodstr;c++,i++){
printf(podstring);
return 0;
}
int duzina=strlen(tekst);
int poz=12; //podstring počinje od pozicije 12
int duzPodstr=10;
char podstring[duzina];
for(int c = poz,i=0;c <= poz+duzPodstr;c++,i++){
char ch= tekst[c];
podstring[i]=ch;
}podstring[i]=ch;
printf(podstring);
return 0;
Pozicija "c" predstavlja poziciju tekućeg karaktera unutar zadatog teksta, a "i" je pozicija tekućeg elementa u nizu char-ova koji predstavlja traženi podstring. Dok pozicija "c" počinje od vrednosti promenljive poz, pozicija "i" počinje od vrednosti nula.
Zadatak je moguće rešiti i na drugi način, pomoću funkcije strcpy() iz zaglavlja <string.h>.
Ova funkcija kopira deo jednog stringa u drugi, koji je po dužini manji ili jednak prvom.
Ostale funkcije iz zaglavlja <string.h> možete pogledati na sledećoj web lokaciji: cplusplus.com/reference/cstring/
Kod je prikazan u nastavku:
Ova funkcija kopira deo jednog stringa u drugi, koji je po dužini manji ili jednak prvom.
Ostale funkcije iz zaglavlja <string.h> možete pogledati na sledećoj web lokaciji: cplusplus.com/reference/cstring/
Kod je prikazan u nastavku:
#include < stdio.h >
#include < string.h >
int main()
{
#include < string.h >
int main()
{
char tekst[]="Priprema za takmičenje iz programiranja";
int duzina=strlen(tekst);
int poz=12; //podstring počinje od pozicije 12
int duzPodstr=10;
char podstring[duzina];
strncpy(podstring,tekst+poz,duzPodstr);
printf(podstring);
return 0;
}
int duzina=strlen(tekst);
int poz=12; //podstring počinje od pozicije 12
int duzPodstr=10;
char podstring[duzina];
strncpy(podstring,tekst+poz,duzPodstr);
printf(podstring);
return 0;
Prvi parametar funkcije strcpy() je podstring koji treba dobiti(odredište), drugi je pokazivač na znak iz polaznog teksta(izvor) na poziciji "poz", dok je treći parametar dužina podstringa.
Posle pokretanja:
Posle pokretanja:
Pretraga dela teksta unutar većeg teksta
Često je potrebno ispitati da li se neka reč ili neki tekst nalazi u zadatom tekstu i ako se nalazi, pronaći na kojim pozicijama. Sledeći primer pokazuje jedan način da se ovo uradi.
Primer 5: Pretraga stringa
Proveriti da li i na kojim pozicijama se zadate reci(ana i pera) nalaze u datom tekstu.
Ispisati koliko puta se ponavljaju i na kojim pozicijama ako se nalaze ili ispisati "nije se pojavila" ako se rec ne nalazi u tekstu.
Ispisati koliko puta se ponavljaju i na kojim pozicijama ako se nalaze ili ispisati "nije se pojavila" ako se rec ne nalazi u tekstu.
Rešenje: Jedan način je korišćenjem linearne pretrage, koja podrazumeva da se prolazi kroz kompletan tekst, znak po znak i poređenje tekućeg znaka sa prvim znakom iz reči koja se traži. Ako se naiđe na znak koji je isti kao prvi znak reči za pretragu, onda se proveravaju i ostali znaci te reči. Ako su dalje i ostali znaci te reči jednaki sa tekućim znakom iz teksta, konstatuje se da je reč pronađena, i konstatuje pozicija odakle podstring (reč) počinje da se pojavljuje unutar teksta. U nastavku pretrage kroz tekst, nastavlja se ispitivanje, od pozicije za jedan više od poslednje zabeležene.
Kod je prikazan u nastavku:
Kod je prikazan u nastavku:
#include < stdio.h >
#include < string.h >
int main()
{
#include < string.h >
int main()
{
char tekst[]={'a','n','a','v','o','l','i','M','i','l','o','v','a','n','a','\0'};
char rec1[] = "ana";
int br1 = 0;
int br2 = 0;
int duzTeksta = strlen(tekst);
int duzReci = strlen(rec1);
int poz1 = -1;//Ako ostane ova vrednost znači da reč nije pronađena
int pronasao = 0;//logička promenljiva koja ukazuje da li se prvo slovo reči poklapa
int brPoj = 0;
for(int i = 0,j = 0; i < duzTeksta; i++){
if(brPoj>0){
else{
return 0;
}
char rec1[] = "ana";
int br1 = 0;
int br2 = 0;
int duzTeksta = strlen(tekst);
int duzReci = strlen(rec1);
int poz1 = -1;//Ako ostane ova vrednost znači da reč nije pronađena
int pronasao = 0;//logička promenljiva koja ukazuje da li se prvo slovo reči poklapa
int brPoj = 0;
for(int i = 0,j = 0; i < duzTeksta; i++){
char chT = tekst[i];
char ch = rec1[j];
if(!pronasao && chT != ch){// još nije došlo do podudaranja tekućeg znaka u tekstu sa prvim znakom tražene reči
else if(!pronasao && chT == ch){ // Nailazak na podudaranje prvog znaka reci koja se pretrazuje sa tekucim znakom
}char ch = rec1[j];
if(!pronasao && chT != ch){// još nije došlo do podudaranja tekućeg znaka u tekstu sa prvim znakom tražene reči
continue;
}else if(!pronasao && chT == ch){ // Nailazak na podudaranje prvog znaka reci koja se pretrazuje sa tekucim znakom
pronasao=1;
poz1=i;
/* Posle nailaska na podudaranje prvog slova tražene reči, nastavlja se ispitivanje da li su i ostale jednake */ while(chT == ch && i < duzTeksta && j < duzReci){
if(j == duzReci){// sva slova trazene reci su bila jednaka sa znacima teksta,
// dakle rec je pronađena
else{
}poz1=i;
/* Posle nailaska na podudaranje prvog slova tražene reči, nastavlja se ispitivanje da li su i ostale jednake */ while(chT == ch && i < duzTeksta && j < duzReci){
i++;
j++;
chT = tekst[i];//znak iz polaznog teksta
ch = rec1[j];//Znak iz reci za pretragu
}j++;
chT = tekst[i];//znak iz polaznog teksta
ch = rec1[j];//Znak iz reci za pretragu
if(j == duzReci){// sva slova trazene reci su bila jednaka sa znacima teksta,
// dakle rec je pronađena
pronasao=0;//u nastavku trazenja od poslednje nađene pozicije, pretražujemo kao na početku,
// dakle, "prvo slovo nije pronađeno".
j=0;
brPoj++;
printf("Pronadjena na %d poz\n",poz1);
}// dakle, "prvo slovo nije pronađeno".
j=0;
brPoj++;
printf("Pronadjena na %d poz\n",poz1);
else{
pronasao = 0;
j = 0;
}j = 0;
if(brPoj>0){
printf("Rec se pojavila %d puta u tekstu\n",brPoj);
}else{
printf("Ne");
}return 0;
U prethodnom kodu se može uočiti da je pretraga izvršena zamo za reč "ana", a ne i za "pera".
U nastavku je prikazan kod koji je sređen i vrši pretragu za obe reči. Ove reči su stavljene u dvodimenzioni niz char-ova:
U nastavku je prikazan kod koji je sređen i vrši pretragu za obe reči. Ove reči su stavljene u dvodimenzioni niz char-ova:
char rec[2][10] = {"ana", "pera"};
U poboljšanom kodu, napravljena je posebna funkcija za pretragu, koja prima kao parametre poziciju od koje se počinje sa pretragom, tekst za pretragu i reč(podstring) koji se traži, a vraća vrednost pozicije nađene reči ili "-1", ako reč nije nađena.
Kod je dat u nastavku:
Kod je dat u nastavku:
#include < stdio.h >
#include < string.h >
int pozicijaUTekstu(int poz, char txt[], char rec[])
{
int main()
{
#include < string.h >
int pozicijaUTekstu(int poz, char txt[], char rec[])
{
int duzTeksta=strlen(txt);
int duzReci = strlen(rec);
int pronasao = 0;
for(int i = poz+1, j=0; i < duzTeksta; i++)
{
return poz;
}
int duzReci = strlen(rec);
int pronasao = 0;
for(int i = poz+1, j=0; i < duzTeksta; i++)
{
char chT = txt[i];
char ch = rec[j];
if(!pronasao && chT != ch)
{
else if(!pronasao && chT == ch)
{
}char ch = rec[j];
if(!pronasao && chT != ch)
{
continue;
}else if(!pronasao && chT == ch)
{
pronasao = 1;
poz = i;
while(chT == ch && i < duzTeksta && j
{
if(j == duzReci)
{
else
{
}poz = i;
while(chT == ch && i < duzTeksta && j
i++;
j++;
chT = txt[i];
ch = rec[j];
}j++;
chT = txt[i];
ch = rec[j];
if(j == duzReci)
{
break;
}else
{
pronasao=0;
j=0;
if(i >= duzTeksta){//ispitano je i poslednje slovo, a nije nađeno novo podudaranje
}j=0;
if(i >= duzTeksta){//ispitano je i poslednje slovo, a nije nađeno novo podudaranje
poz=-1;
break;
}
break;
return poz;
int main()
{
char tekst[ ]= {'a', 'n', 'a', 'v', 'o', 'l', 'i', 'M', 'i', 'l', 'o', 'v', 'a', 'n', 'a', '\0'};
char rec[2][10]= {"ana", "pera"};
int brPoj = 0;
int poz=-1;
for(int i=0; i < 2; i++)
{
return 0;
}
char rec[2][10]= {"ana", "pera"};
int brPoj = 0;
int poz=-1;
for(int i=0; i < 2; i++)
{
do
{
else
{
brPoj=0;
}{
poz = pozicijaUTekstu(poz,tekst,rec[i]);
if(poz != -1)
{
while(poz != -1);
if(brPoj > 0)
{
}if(poz != -1)
{
brPoj++;
printf("Rec %s Pronadjena na %d poz\n",rec[i],poz);
}
}printf("Rec %s Pronadjena na %d poz\n",rec[i],poz);
}
while(poz != -1);
if(brPoj > 0)
{
printf("Rec %s se pojavila %d puta u tekstu\n",rec[i],brPoj);
else
{
printf("Rec %s se nije pojavila u tekstu nijednom\n",rec[i]);
}brPoj=0;
return 0;
Posle izvršenja programa:
U glavnoj funkciji (main) je zadat dvodimenzionalni niz znakova sa rečima za pretragu i definisani su, tekst za pretragu, početna pozicija inicijalizovana na -1 i broj pojavljivanja, čija je početna vrednost nula.
U do-while petlji, poziva se funkcija pozicijaUTekstu(), kojoj se kao parametri prosleđuju, pozicija, tekst i reč za pretragu i ona vraća prvu poziciju veću od prethodno pronađene, na kojoj se nalazi pronađena reč, ili -1, ako se reč ne nalazi u tekstu.
U do-while petlji, poziva se funkcija pozicijaUTekstu(), kojoj se kao parametri prosleđuju, pozicija, tekst i reč za pretragu i ona vraća prvu poziciju veću od prethodno pronađene, na kojoj se nalazi pronađena reč, ili -1, ako se reč ne nalazi u tekstu.
Prethodno
|< Stringovi u C/C++ jeziku |
Sledeće
Dvodimenzionalni nizovi - matrice >| |