$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Deklaracija i inicijalizacija stringova

Stringovi u C-u su jednodimenzionalni nizovi karaktera, čiji je poslednji element null karakter, odnosno karakter sa rednim brojem 0 u ASCII tabeli.

Stringovi se i deklarišu kao nizovi karaktera

char str[7];

a može im se dodeliti vrednost na dva načina:

  • char str[7] = {'Z', 'd', 'r', 'a', 'v', 'o', '\0'}; - poslednji element mora biti null karakter
  • char str[7] = "Zdravo"; - string je niz karaktera u dvostrukim navodnicima, kod ovog slučaja kompajler će napraviti niz od 7 karaktera, od kojih će prvih 6 biti popunjeno vidljivim karakterima koji su dodeljeni stringu, a na poslednje mesto će se postaviti null karakter.

Ovde možemo primetiti da je veličina niza jednaka duzini stringa plus jedan.

Kao i svakom nizu i stringu se može dodeliti vrednost pojedinačnog elementa po indeksu, na primer

str[1] = 'a'

Ispis i učitavanje stringova

String se može ispisati na sistemski izlaz pozivom funkcije printf koja kao parametar prima string

printf(str);

A string se može umetnuti u ispis nekog drugog stringa korišćenjem znaka %s

printf("Pozdrav: %s", str);

Učitavanje stringa preko sistemskog ulaza može se izvršiti funkcijom scanf("%s", str), međutim ova funkcija čita samo jednu reč, odnosno čita string samo do unetog praznog karaktera (space). Ovo naravno nije dovoljno i potrebno je realizovati funkcionalnost čitanja celog stringa, najčešće do kraja reda (\n) ili oznake EOF (end of file).

Ova funkcionalnost bi se mogla implementirati korišćenjem funkcije getchar za čitanje jednog po jednog karaktera i smeštanje u niz. Program koji ovo implementira prikazan je na sledećem listingu.

#include 
int main(){
    char str[30],ch;
    int i=0;
    printf("Unesite string: ");
    while(ch!='\n'){
        ch=getchar();
        str[i]=ch;
        i++;
    }
    str[i]='\0';
    printf("Uneti string: %s", str);
    return 0;
}

U ovom programu se u jednoj while petlji učitavaju karakteri funkcijom getchar() sve dok se ne naiđe na kraj reda, odnosno karakter \n. Svaki učitani karakter se smešta u niz karaktera koji predstavlja string, a na kraju se dodaje i null karakter.

Pošto je funkcionalnost učitavanja stringa potrebna u mnogim programima, u programski jezik C kao deo biblioteke stdio ugrađene su funkcije za čitanje i ispis celog stringa, to su funkcije

  • gets(str) - učitava ceo string str sa sistemskog ulaza,
  • puts(str) - ispisuje string str na sistemski izlaz.

Primer programa koji učitava i ispisuje string korišćenjem ove dve funkcije:

#include 
int main(){
    char str[30];    
    printf("Unesite string: ");
    gets(str);
    printf("Uneti string: ");
    puts(str);
    return 0;
}

Stringovi kao parametri funkcija

Pošto su stringovi u C-u realizovani kao nizovi karaktera, korišćenje stringova u funkcijama vrši se na isti način kao korišćenje nizova.

Deklaracija funkcije koja uzima string kao ulazni parametar vrši se na isti način kao kod nizova. Parametri se mogu deklarisati kao nizovi

int funkcija(char str[]);

ili kao pokazivači

int funkcija(char* str);

Na sledećem listingu prikazana je funkcija toUpper koja kao parametar prima string a vrši pretvaranje svih malih slova iz ulaznog stringa u velika.

#include 
#include 

void toUpper(char str[]); // sva slova u stringu pretvara u velika

int main(){
    printf("Unesite string: \n");
    char unos[200];
    gets(unos);
    toUpper(unos);
    printf("Uneti string posle poziva funkcije toUpper: %s\n", unos);
    return 0;
}

void toUpper(char str[]){
    int i = 0;
    while(str[i]!='\0'){
       if('a'<=str[i] && str[i]<='z'){
            str[i] = str[i]-32;
       }
       i++;
    }
}

Funkcija se u jednoj while petlji kreće po elementima niza, odnosno karakterima u stringu i kada naiđe na malo slovo pretvara ga u veliko tako što oduzima 32 koliko je rastojanje između malih i velikih slova u ASCII tabeli. U uslovu while petlje koristi se karakter '\0' koji označava kraj stringa, odnosno while petlja se izvršava dok ne dođemo do null karaktera koji označava kraj stringa.

U main funkciji se poziva funkcija toUpper i ispisuje se rezultat. Treba primetiti da se string koji je prosleđen kao parametar ne vraća kao rezultat funkcije, nego se menja sam parametar. Razlog je što su strigovi kao i nizovi realizovani kao pokazivači i promenom vrednosti elemenata niza ili stringa u funkciji menja se direktno vrednost na određenoj memorijskoj lokaciji i te promene ostaju sačuvane i posle izvršavanja funkcije (prosleđivanje po referenci).

Kako bi se funkcija toUpper implementirala korišćenjem pokazivača?

void toUpperPok(char *str){
    while(*str!='\0'){
       if('a'<=*str && *str<='z'){
            *str = *str-32;
       }
       str++;
    }
}

U ovoj funkciji parametar je pokazivač. U funkciji nam nije potreban brojač, jer umesto pristupa nizu preko indeksa koristimo aritmetičku operaciju inkrementacije nad pokazivačem. Odnosno, u svakoj iteraciji while petlje pomeramo pokazivač str na sledeći element stringa. Uslov za izlazak iz while petlje je da smo došli do poslednjeg elementa u stringu, a to je karakter '\0'.

Ugrađene funkcije za rad sa stringovima

U C-u postoji veliki broj ugrađenih funkcija za rad sa stringovima koje se uvoze iz biblioteke string.h, neke od korisnih funkcija prikazane su u sledećoj tabeli.

FunkcijaZnačenje
strcpy(s1, s2)kopira string s2 u string s1
strcat(s1, s2)konkatenacija stringova, string s2 se dodaje na kraj stringa s1
strlen(s1)vraća dužinu stringa s1, vraća se broj karaktera u stringu bez null karaktera
strcmp(s1, s2)poređenje stringova, vraća 0 ako su s1 i s2 jednaki, manje od 0 ako je s1s2
strchr(s1, ch)vraća pokazivač na prvo pojavljivanje karaktera ch u string s1
strstr(s1, s2)vraća pokazivač na prvo pojavljivanje stringa s2 u stringu s1
strlwr(s1)sva slova u stringu s1 pretvara u mala slova
strupr(s1)sva slova u stringu s1 pretvara u velika slova

Sledi program koji ilustruje korišćenje nekih od funkcija iz tabele.

#include 
#include 

int main(){
   char str1[] = "Zdravo";
   char str2[] = "svima";
   char str3[12];
   int  duzina;

    /* kopira str1 u str3 */
   strcpy(str3, str1);
   printf("strcpy( str3, str1), str3 = %s\n", str3 );

   /* konkatenacija stringova str1 i str2 */
   strcat( str1, str2);
   printf("strcat( str1, str2), str1 = %s\n", str1 );

   /* duzina stringa str1 posle konkatenacije */
   duzina = strlen(str1);
   printf("strlen(str1) :  %d\n", duzina );
   return 0;
}

U ovom primeru vrši se kopiranje stringova, konkatenacija stringova i ispis dužine stringa.

Stringovi str1 i str2 su inicijalizovani prilikom deklaracije, a string str3 je samo deklarisan, ali mu se naredbom strcpy(str3, str1) dodeljuje vrednost stringa str1. Zatim se vrši konkatenacija stringova str1 i str2, tako da se string str2 dodaje na str1 i na kraju se pronalazi dužina stringa str1. Kada se ovaj program pokrene na sistemski izlaz se ispisuje:

strcpy(str3, str1), str3 = Zdravo
strcat(str1, str2), str1 = Zdravosvima
strlen(str1) :  11