Da ponovimo:  Promenljive tipa char

 

char je tip promenljive koji može da čuva samo jedan simbol (znak, slova, broj...).

’n’ je simbol, preciznije slovo.

Na drugoj strani „n“ je niz simbola. Zašto? Uskoro ćete saznati, za sada je bitno da uvidite da se simbol stavlja pod jednostruke navodnike ( ’ ’ ), a niz simbola (string) pod regularne navodnike( “ “ ).

Razmotrimo inicializaciju:

char slovo = ’a’;

Na prvi pogled, slovo će sadržati vrednost ’a’. Nije baš tako.  Promenljive koje su tipa char mogu da čuvaju samo brojeve, kao i  int, ali pošto char ima samo jedan bajt, najveća vrednost koju može čuvati je 255. Kako onda promenljivoj char možemo dodeliti neki simbol kada ona u stvari čuva brojeve? Postoji „tabela“ u kojoj se nalaze simboli (ukupno 255 njih) i svaki simbol ima svoj redni broj. Mi možemo proslediti decimalni broj (a on se nalazi u rasponu od 0 do 255) tabeli i kao rezultat ćemo dobiti simbol koji je pod tim rednim brojem. Primera radi, simbol ’a’ ima vrednost 97 u toj tabeli pa će promenljiva slovo iz gornjeg primera čuvati vrednost od 97 a ne sam simbol. Odavde se da zaključiti da je slovo moglo biti i tipa int. Sledi program koji će na ekran (tačnije na konzolu) ispisati sve simbole i njihove redne brojeve:

/*  PROGRAM TABELA_SIMBOLA */
#include <stdio.h>


int main(void)

{

     int simb;


     for(simb = 0; simb < 255; simb++)

           printf("%d %c \n", simb, (char)simb);


     return 0;

}

Obratimo pažnju na red koji sadrži funkciju printf(). Prvo se prikazuje decimalna vrednost promenljive simb, i tu je sve jasno. Zatim smo koristeći upravljački znak %c rekli da na tom mestu treba da se ispiše neki znak. To govori funkciji da umesto decimalne vrednosti koju bude dobila treba da ispiše  odgovarajući simbol iz tabele. Kao treći argument smo naveli (char)simb .Ovde smo izvršili eksplicitnu konverziju, ali to nam i nije bilo potrebno jer će funkcija printf() sama izvršiti konverziju (implicitnu) iz razloga što ona kao treći argument očekuje promenljivu tipa char, a ne tipa int.

Mali detalj: Do sada ste za prelazak u novi red koristili ’\n’. Pokrenite ponovo gornji program i obratite pažnju na simbol pod rednim brojem deset. Nema ništa, a ispod njega je prazan red. Razlog ovome je taj što se pod rednim brojem 10 nalazi upravo znak za novi red- ’\n’.

 

            string -  niz promenljivih tipa char

Pogledajmo načine na koje možemo deklarisati i inicializovati ovu vrstu promenljivih:

char TEST[] = “toxi“;
char TEST[] = { ’t’, ’o’, ’x’, ’i’ };

Bitno je znati da samo ime nizovske promenljive predstavlja konstantni pokazivač na  prvi element tog niza. Što će reći da ćemo ako napišemo:    TEST;   ili    &test[0]; dobiti istu stvar - adresu prvog elementa niza.

Šta mislite koliko TEST, u gornjem primeru ima elemenata? Ako ih prebrojite naići ćete na broj 4. Ipak, TEST ima 5 elemenata. Da bi prikazali vrednost TEST-a napisacemo ovu naredbu:

printf(“%s “, TEST);

Koristili smo upravljački znak %s kojim signaliziramo da želimo prikazati string (niz char-ova). Funkciji printf() smo predali adresu prvog elementa niza (jer smo još predali: TEST , što je adresa prvog elementa tog niza). Printf() prikazuje element po element... Kako će znati kada je kraj niza? Da bi to omogućili, na kraj svakog stringa se dodaje još jedan znak – ’\0’ ( kosa crta unazad i nula) koji dakle signalizira kraj stringa. Sada treba da vam je jasno zašto u gornjem primeru TEST ima 5 a ne 4 elementa. I to je veoma bitna stvar!

Da bi utvrdili naučeno, napisaćemo dva mala programa:

/*  PROGRAM VEZBA_1 */
#include <stdio.h>


void func(int a)

{

     a = 123;

}


int main(void)

{

     int broj = 7;
    
     printf("Vrednosti BROJ pre poziva func() je %d \n", broj);


     func(broj);

     printf("Vrednosti BROJ posle poziva func() je %d \n", broj);


     return 0;

}

 Trebalo bi da vam je jasno zašto će vrednost promenljive broj ostati ista i posle poziva funkcije func().

 

Drugi program je ovaj:

/*  PROGRAM VEZBA_2 */
#include <stdio.h>

#include<string.h>


void func(char a[])

{

     strcpy(a, "nova_vrednost");

}


int main(void)

{

     char broj[20] = "todic";
    

     printf("Vrednosti BROJ pre poziva func() je %s \n", broj);


     func(broj);

     printf("Vrednosti BROJ posle poziva func() je %s \n", broj);


     return 0;

}

Vrednost je promenjena, zato što smo funkcije func() predali samo ime promenljive broj dakle adresu prvog elementa. Samim tim func() je u mogućnosti da menja vrednost broj-a.

Obratimo pažnju na to da smo uključili još jedan header fajl - string.h . Ovo smo uradili jer nam je bila potrebna funkcija strcpy() – ona služi za dodeljivanje jednog stringa drugom. Pašće vam na pamet da smo mogli da napišemo:

a = “nova_vrednost“;

Međutim to nije omogućeno pa se za dodavanje nove vrednosti stringu koristi funkcija strcpy().  

 

Za kraj ćemo još jednom napomenuti da je veoma važno da za niz char-ova izdvojite dovoljno mesta u memoriji, dakle ogromna je greška napisati:

char ime[5]; 
strcpy(ime, “Pera Detlic“);

Uvek obratite pažnju na ovo!


            8.1 STRING.H

Naredbom #include<string.h> u program uključujemo fajl string.h u kojem su definisane razne funkcije za baratanje sa stringovima.

 

Funkcije za kopiranje stringova

 

strcpy():

char* strcpy(char *, const char *);

 

Ova funkcija služi za dodeljivanje jednog stringa drugom. Kao sto se iz date deklaracije vidi, ona uzima dva argumenta: pokazivač na tip char i konstantni pokazivač na tip char. Povratni tip ove funkcije je takođe pokazivač na tip char.

 

strncpy()

char* strncpy( char*, const char*, size_t )

 

Uloga ove funkcije je da u prvi argument kopira onoliko znakova drugog argumenta koliko je navedeno trećim argumentom. Drugim rečima strncpy() kopira samo jedan, početni deo stringa (znakovnog niza). Primer korišćenja ove funkcije:

 

/*  PROGRAM STRNCPY1 */ 
#include <stdio.h>

#include <string.h>


void main(void)

{

     //deklaracija promenljivih

     char rec1[50], rec2[50];


     //dodeli vrednost promenljivoj rec1

     strcpy(rec1, "trivijalni tekst");


     //kopiraj prvih 8 elemenata stringa rec1 u string rec2

     strncpy(rec2, rec1, 8);

     rec2[8] = '\0';


     printf("Rec2 je -> %s.\n", rec2);

}

Obratite pažnju da smo napisali rec2[8] = '\0'; razlog je taj što funkcija strncpy(), za razliku od strcpy(), ne dodaje znak za kraj stringa pa ga moramo izričito dodati.

Jedna napomena, treći argument ove funkcije je tipa size_t. Ovaj tip podatka ne može čuvati negativne brojeve samo pozitivne ( isto ponašanje ispoljava i tip unsigned int). To je ovde vrlo logično koristiti jer kako može da broj elemenata bude negativan? Ne može, naravno.

 

Funkcije nadovezivanja

 

strcat()

char* strcat( char*, const char*);

 

strncat()

char* strncat( char*, const char*, size_t);

 

Prva funkcija služi za nadovezivanje jednog stringa na drugi. Recimo da imate jedan string „todic“ i jos jedan string „ nemanja“, ako hoćete da ih spojite u jedan string koristicete funkciju strcat(). Sledi primer za korišćenje ove funkcije:

/*  PROGRAM STRCAT1 */
#include <stdio.h>

#include <string.h>


void main(void)

{

     //deklaracija promenljivih

     char rec1[50];


     //dodeli vrednost promenljivoj rec1

     strcpy(rec1, "trivijalni tekst.");


     //dodaj jos teksta promenljivoj rec1

     strncat(rec1, " I jos jedan!");


     printf("Rec1 je -> %s\n", rec1);

}

Ovde je sve jasno.

Korišćenje funkcije strncat() je slično kao kod strncpy(), dakle prvi argument se „povećava“ za jedan, početni deo drugog argumenta. Koliki je taj drugi deo određuje se trećim argumentom. Takođe ćete morati sami da dodate simbol ’\0’ prvom argumentu.

 

Funkcije poređenja

 

strcmp()

int strcmp( const char*, const char*);

 

strncmp()

int strncmp( const char*, const char*);

 

Pomoću ovih funkcija možete proveriti da li su stringovi indentični. Ako stringovi jesu isti funkcija vraća vrednost nulu, a ako su različiti jedinicu ili neki drugi broj različit od nule. Primer:

/*  PROGRAM STRCMP1 */ 
#include <stdio.h>

#include <string.h>


void main(void)

{

     //deklaracija promenljivih

     char rec1[50], rec2[50];


     //dodeli vrednost promenljivim

     printf("Unesite dve reci-> ");

     scanf("%s %s", rec1, rec2);


     //uporedi tekst

     if( strcmp(rec2, rec2) )

        printf("Reci su razlicite!");

     else

           printf("Reci su potpuno iste!");

}

Funkcijom strncmp() moguće je porediti samo par elemenata sa početka nizova. Koliko elemenata će biti poređeno se određuje trećim argumentom.

 Jos jednu funkciju iz string.h cemo objasniti. To je strlen(). Ova funkcija vraća dužinu znakovnog niza koji joj prosledimo. Ako imamo:

char rec[50] = “neki string...“; 
printf(“Duzina ovog stringa je %d. \n“,  strlen(rec));

 Na ekran (pravilnije rečeno na konzolu) će se ispisati koliko elemenata ima ovaj string.

Last modified: Thursday, 28 March 2019, 7:20 PM