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 dužini 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.

slika koda

(Kod.c)

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.h 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(void){
    char str[30];    
    printf("Unesite string: ");
    gets(str);
    printf("Uneti string: ");
    puts(str);
    return 0;
}

!!! vodite računa da se funkcija gets() ne koristi u novijim varijantama programskog jezika C !!!


 - - - Detaljnije o svemu  - - -

STRINGOVI

String je jednodimenzionalni niz tipa char. Da bi se znalo gde se u nizu završava string dopisuje mu se takozvani zavšni ili NULL znak: '\0', koji je sastavni deo stringa. Rad sa stringovima predstavija specifičan način korišćenja niza znakova.


String konstante

Za C kompajler string konstanta je svaki niz znakova između navodnika. Znaci između navodnika plus završni znak se registruju u nizu susednih memorijskih lokacija. Zbog prisustva završnog znaka string konstanta "C" nije jednaka znakovnoj konsranti 'C', jer je "C" niz od dva znaka: 'C' i '\0'. Prazna string konstanta " " se sastoji samo od završnog znaka.


Inicijalizacija stringova

Stringovi se mogu inicijalizovati korišćenjem string konstanti.

Na primer, operator

char s[]="IBM PC";

inicijalizuje niz s datom string konstantom.. Ovaj način inicijalizacije predstavlja skraćeni oblik inicijalizacije niza

1
 char s[]={'I','B' 'M',' ','P' ,'C' ,'\O'};

Ako bi se u inicijalizaciji izostavio završni znak to više ne bi bio string već samo niz znakova.

Kao i kod drugih nizova, ime s predstavlja pokazivač na nulti element niza, tako da važi:

1
s=&s[0],  *s='I', i   *(s+1)=s[1]='B'


Primer 1. Napisati program koji ispisuje string, u direktnom i inverznom poredku.

I način

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(void)
{
 
char s[]="IBMPC-486"; ........1
char *pok; ...................2
pok=s;........................3
 
while (*pok)
  putchar(*pok++ );...........4
 
putchar('\n');
while (--pok>=s)
  putchar(*pok); .............5
 
putchar('\n'); ...............6
getch();
return 0; 
}

II način ( Za kreiranje stringa može se koristiti i pokazivač.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#inc1ude <stdio.h>
void main(void)
{
 
char *pok1="IBMPC-486";
char *pok2;
pok2=pok1;
 
while (*pok2) /* traži kraj stringa, i istovremeno štampa string */
  putchar(*pok2++ );
 
while (--pok2>=pok1) /* prolaz kroz string s kraja uz stampanje */
  putchar(*pok2);
 
putchar('\n');
}

Napomena. 

1) najava string promenljive s[] i dodela vrednosti "IBMPC-486" toj promenljivoj 

2) najava pokazivača na podatak tipa char
3) adresa pok dobija vrednost adrese s. 
4) naredba putchar() prikazuje jedan znak na ekranu. *pok++ govori da se prvo upotrebljava vrednost *pok pa se posle izvršava uvećavanje pok++. Celokupna while petlja, dakle prikazuje u direktnom poretku string. 
5) petlja prikazuje string u inverznom poretku 
6) prelazi u nov red



Učitavanje stringova

Pri učitavanju stringova treba voditi računa o dve stvari: kako rezervisati memoriju za čuvanje stringa i kako primeniti funkciju za učitavanje stringa. Na početku rada potrebno je odrediti maksimalnu dužinu stringa koji će se učitavati da bi kompajler dodelio traženi memorijski prestor. 

Na primer, deklaracijom

   char ime[101];

uvodi se niz ime od najviše sto jednog elementa. 

Učitavanje se može realizovati pomoću dve bibliotečne funkcije scanf () i gets ().


Funkcija gets()

Za učitavanje stringova funkcija gets() se češće koristi od scanf (). Ona prihvata znake sa tastature dok ne naiđe na znak za "novu liniju" (‘\n') koji se proizvodi pritiskom na taster ENTER. Ona ignoriše znak za "novu liniju" i dodaje završni ili nulti znak ('\0') stringa.

Funkcija gets () ima sledeće zaglavlje:

char *gets(char *s)

gde je argument s pokazivač na string. Funkcija kojoj se predaje učitani niz kao argument predaje ime niza koji je u stvari adresa nultog elementa niza u koji se kopiraju vrednosti koje prosleđuje gets ().

Medutim, treba voditi računa da je vrednost funkcije pokazivač na adresu do koje je učitan string ako je učitavanje korektno, u protivnom vrednost je NULL (nulta adresa koja je definisana u fajlu stdio.h sa 0). 
Kontrola ulaza se može realizovati na sledeći način:

while (gets(ime)==NULL);

Ako se ne vrši kontrola korektnog učitavanja funkcija gets () se može pozivati na sledeći način:

gets(ime);

i tada se ne mora deklarisati: char *gets()


Primer učitavanja stringa:

1
2
3
4
5
6
7
8
9
10
11
12
int main(void)
{
 
char ime[101];
char pok,gets();
printf("Unesi jedno ime:\n");
pok=gets(ime);
 
printf("1. nacin za ispis ucitanog imena;%s\n",ime); /*koristi se adresa stringa ime*/
printf("2. nacin za ispis ucitanog imena:%s\n",pok); /*adresa stringa ime, ali koju vraca funkcija gets()*/

return 0;}


Funkcija scanf()

Za razliku od funkcije gets() koja je pogodna za učitavanje stringova funkcija scanf () omogućava učitavanje mešovitih podataka u standardnoj formi. Funkcija scanf () vraća broj učitanih i dodeljenih podataka. Ako je ulaz nekorektan vraća nulu.

Primer učitavanja stringa:

1
2
3
4
5
6
7
8
9
int main(void){
char imel[50],ime2[60];
int brojac,god;
printf(Unesite ime i prezime.\n”);
 
brojac=scanf("%s%5s”,ime1,ime2);
printf("Ucitana su %d podatka: %s %s .\n" ,brojac,ime1,ime2);

return 0;}



Ispis stringova

Za ispis stringova se koriste dve bibliotečke funkcije puts() i printf(). Funkcija puts() ispisuje samo stringove, a printf() može ispisivati mešovite podatke. Dok se pri ispisu stringa sa puts() automatski prelazi na novu liniju pri korišćenju printf() to se mora naznačiti sa '\n'. Na primer:

printf("%s\n" ,string);

ima isti efekat kao i

puts(string);

Funkcija puts()

Ova funkcija ima samo jedan argument - pokazivač na početnu tačku stringa (ill podstringa) koji treba ispisati. Ova funkcija ispisuje sve znake počev od tačke na koju pokazuje argument funkcije do završinog znaka ('\0') koga zamenjuje znakom za "novu liniju" tako da se posle ispisa stringa prelazi na novu liniju. 
Zaglavlje funkcije puts() ima sledeći oblik:

int puts(char *string);

Ukoliko se u toku izlaza stringa pojavi grška funkcija vraća vrednost EOF (jednako -1), ako nema greške vraća nenegativnu vrednost.
Sledeći program ilustruje nekoliko načina za ispis stringa.

Primer.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#define NASLOV “Osnovi programiranja"
int main(void)
{
  static char s1[]="Metode programiranja";
  static char *s2="Objektno programiranje";
  puts(NASLOV);
  puts(sl);
  puts(s2);
  puts( &s1[3]);
  puts(sl+2);
  puts(s2+9);
  puts("I ovaj string prihvata puts().");
  return 0; } 

Izvršavanjem programa ispisuje se:

Osnovi programiranja 
Metode programiranja
Objektno programiranje 
ode programiranje
tode programiranja 
progmmiranje
I ovaj string prihvata puts().

Poslednja izmena: петак, 30. септембар 2022, 17:53