Da se podsetimo - Stringovi:

U C-u su stringovi definisani kao nizovi karaktera. Na primer, sledeći primer definiše string od 50 znakova:

  char ime[50];

C nema ugrađene funkcije za rad sa stringovima, pa je sledeće neispravno:

  char ime[50],prezime[50],punoime[100];
ime=“Arnold“; /* Neispravno */
prezime=“Schwarznegger“; /* Neispravno */
punoime=“Mr“+ime+prezime; /* Neispravno */

Međutim, postoji specijalna biblioteka sa funkcijama za rad sa stringovima na koju ćemo naići kasnije.

Da bismo ispisali string, kristimo printf sa specijalnim kontrolnim znakom %s:

  printf(„%s“,ime);

Samo treba da damo ime stringa.

VAŽNO: String u C-u je niz od nula ili više karaktera koji se završava oznakom kraja stringa ( \0 )

Da bi dozvolili promenljive dužine stringova, znak \0 se koristi da bi ukazao na kraj stringa.

Dakle, ako imamo string ime iz gornjeg primera, i dodelimo mu vrednost „ANA“, njegov sadržaj će izgledati ovako:


Jako je važno da sačuvamo tu oznaku kraja, jer je to način na koji C „zna“ koliko je dugačak string. Svim standardnim funkcijama za rad sa stringovima je on potreban za uspešan rad.

U opštem slučaju, osim nekih funkcija koje zahtevaju dužinu (strncat(), strncmp() i strncpy()), ako ne kreirate stringove ručno, ne bi trebalo da imate problema. Trebalo bi da se naviknete da koristite što više korisnih funkcija za rad sa stringovima i izbegavate da ih sami pišete.


Osnovne funkcije za rad sa stringovima

<string.h>

Skoro sve funkcije za rad sa stringovima se nalaze u biblioteci string.h.

Uobičajene funkcije iz ove biblioteke su opisane ispod:

  int strcmp(const char *string1,const char *string2)

— Poredi string1 i string2 u cilju određivanja alfabetskog poretka.

  char *strcpy(const char *string1,const char *string2)

— Kopira string2 u string1.

  int strlen(const char *string)

— Određuje dužinu stringa.

  char *strncat(const char *string1, char *string2, size_t n)

— Dopisuje n karaktera iz string2 u string1.

  int strncmp(const char *string1, char *string2, size_t n)

— Poredi prvih n karaktera dva stringa.

  char *strncpy(const char *string1,const char *string2, size_t n)

— Kopira prvih n karaktera od string2 u string1.


Korišćenje većine ovih funkcija je jednostavno, na primer:

...

char *str1 = "Pozdrav ! ";

char *str2;

int duzina;

duzina = strlen(str1); /*  duzina = ? */

strcpy(str2,str1);

...

Zapamtite da strcpy() vraća kopiju svog prvog argumenta, odredišnog stringa. Zapamtite i da se uvek piše prvo odredišni string, a onda string iz kog se kopira, što se često dešava da pobrkamo prilikom programiranja.

Funkcija strcmp() leksički poredi dva ulazna stringa i vraća:

negativan broj — ako je string1 leksički manji od string2.

nula — ako su string1 i string2 leksički jednaki.

pozitivan broj — ako je string1 leksički veći od string2.

Sledeća stvar može zbuniti početnike, a neretko i iskusne programere, ako zaborave.

Funkcije strncat(), strncmp() i strncpy() su dužinski ograničene verzije svojih generalizacija. One završavaju sličan zadatak, ali samo za prvih n karaktera. Zapamtite da se može izgubiti završavajući znak za string kada koristite ove funkcije, na primer:

...

char *str1 = "Pozdrav ! ";

char *str2;

int n = 2;

strncpy(str2,str1,n); /*  str2 = "Po" */

...

PAZITE! str2 nema oznaku za kraj stringa ! ! !


Pretraživanje stringova

Bilioteka string.h takođe sadrži nekoliko funkcija za pretraživanje stringova:

  char *strchr(const char *string, int c)

— Pronalazi prvo pojavljivanje karaktera c u stringu.

  char *strstr(const char *s1, const char *s2)

— Pronalazi prvo pojavljivanje stringa s2 u stringu s1.

  char *strpbrk(const char *s1, const char *s2)

— Vraća pokazivač na prvo pojavljivanje bilo kog karaktera iz stringa s2 u stringu s1, ili prazan pokazivač ako ni jedan karakter iz s2 ne postoji u stringu s1.


strchr() je najjednostavnija za korišćenje, na primer:

...

char *str = "Pozdrav";
char *odg;
odg = strchr(str1,'a');

...
Nakon izvršavanja ovog dela koda, odg pokazuje na memorijsku lokaciju str1 + 5.

strpbrk() je malo opštija funkcija koja traži prvo pojavljivanje bilo kog iz grupe karaktera, na primer:

...

char *str = "Pozdrav";
char *odg;
odg = strpbrk(str1,'aeiou');

...
Ovde, odg pokazuje na memorijsku lokaciju str1 + 1, prvo pojavljivanje slova o.


strstr() vraća pokazivač na traženi string ili prazan pokazivač ako string nije nađen. Ako s2 pokazuje na string dužine nula (to jest, string „“), funkcija vraća s1. Na primer,

...

char *str = "Pozdrav";
char *odg;
odg = strstr(str1,'av');

...
će dati odg = str + 5.


<stdlib.h>

U standardnoj biblioteci funkcija uz jezik C postoji nekoliko funkcija za konverziju brojeva iz znakovnog oblika (niza cifara) u numeričke tipove kojim amogu da se vrše numerička izračunavanja. One su opisane u standardnom zaglavlju <stdlib.h>. Ovde su prikazane tri najjednostavnije funkcije iz te grupe:

 atof(s)  -   Konverzija u realan broj (float)
 atoi(s)  -   Konverzija u ceo broj (int)
 atol(s)  -   Konverzija u dugačak ceo broj (long)

Parametar s sve tri navedene funkcije je niska znakova (tipa string) koja treba da sadrži niz cifara broja koji se konvertuje. Eventualni beli znaci na početku niske s se preskaču, a konverzija se završava kod prvog znaka koji ne može da bude deo broja.



  - - - Detajnije o nekim funkcijama . . . - - -

Funkcija strcat()

Zaglavlje funkcije strcat() ima sledeći oblik

char *strcat(char *strl,char *str2)

Funkcija povezuje dva stringa tako što stringu strl uklanja završni znak i počev od tog mesta kopira string str2. String str2 se ne menja. 
Sledeći primer ilustruje korišćenje funkcije strcat():

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <string.h>
void main(void)
{
  static char s1[30]="Slalom, ";
  static char s2[]="veleslalom, ";
  printf("%s\n”,strcat(s1,s2));
  strcat(sl,"spust.");
  printf("%s\n”,s1);
} 

Izvršavanjem programa ispisuje se:

Slalom, veleslalom,

Slalom, veleslalom, spust.


Funkcija strcmp()

Funkcija strcmp() koja poredi dva stringa ima sledeće zaglavlje:

int strcmp(char *strl,char *str2)

Dva stringa, koji se zadaju kao argumenti, se porede znak po znak dok se ne ustanovi razlika vrednosti ili dok se jedan od stringova ne završi. Ako su stringovi jednaki funkcija vraća nulu. U protivnom funkcija vraća razliku vrednosti u ASCII kodu prvog para znakova koji nije jednak. 
Sledeći primer ilustruje korišćenje strcmp() funkcije:

1
2
3
4
5
6
7
void main(void)
{
  printf("%d\n",strcmp("ABC","ABC")); /* 0 */
  printf("%d\n",strcmp("ABC","BCD")); /* -1 */
  printf("%d\n",strcmp("BCD","ABC")); /* 1 */
  printf("%d\n",strcmp("ABC","ABCD")); /* -68 */
}


Pri prvom pozivu funkcije printf() ispisuje se nula jer su stringovi jednaki. Pri drugom pozivu pošto se ne slaže prvi par znakova ispisuje se njihova ASCII razlika: -1 (kod od 'A' (65) minus kod od 'B' (66)). Treći poziv printf() ispisuje razliku 'B' i 'A': 1. U četvrtom slučaju prva tri znaka su podudrna, ali četvrti znak od 'ABC' je '\0' što se razlikuje od četvrtog znaka drugog stringa: 'D'. Dobija se vrednost: '\0' - 'D'=0 - 68= -68, gde je 68 ASCII kod od 'D'.


Funkcija strcpy()

Ova funkcija zamenjuje operaciju dodeljivanja stringova koja nije predviđena u C jeziku. Zaglavije funkcije strcpy() ima sledeći oblik:

char *strcpy(char *strl,char *str2)

String na koji pokazuje str2 se kopira znak po znak u oblast memorije na koju pokazuje str1. Pokazivači se ne menjaju, već se kopiraju samo znakovi. Funkcija strcpy() vraća vrednost svog prvog argumenta, tj. pokazivač na novokopirani string. 
Sledeći primer ilustruje konšćenje ove funkcije:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>
void main(void)
{
  char str1[3l];
  strcpy(str1,"Halo");
  puts(str1);
  puts(strcpy(str1,"Zdravo"));
}


Izvršavanjem programa ispisuje se:

Halo

Zdravo


Funkcija atoi()

Ova funkcija pretvara ASCII string u ceo broj. Zaglavlje funkcije atoi () ima sledeći oblik:

int atoi( char *string)

Ako string sadrži decimalni broj funkcija atoi() vraća ekvivalentan ceo broj. Ispred decimalnog broja može biti proizvoljan broj nula, praznina i znakova tabulacije, koji se ignorišu. Može počinjati znakom - (minus) ako je negativan. Broj se završava sa '\0', ill bilo kojim znakom koji nije cifra. Pri korišćenju ove funkcije mora se u program uključiti zaglavlje <stdlib.h>
Na primer, izvršavanjem programa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdlib.h>
#include <stdio.h>
void main()
{
  printf("%d\n",atoi("423”));
  printf("%d\n",atoi("+423”));
  printf("%d\n",atoi("-423”));
  printf("%d\n",atoi("00000000423”));
  printf("%d\n",atoi(" 423”));
  printf("%d\n",atoi("423 ”));
  printf("%d\n",atoi("7.7”));
  printf("%d\n",atoi("423xyz”));
  printf("%d\n",atoi("123456789”));
}
 

Ispisuje se:

423
423
-423
423 
423 
423
7
423 
-13035

U poslednjem pozivu printf() dobija se nekorektan rezutat jer je broj "123456789", prekoračio interval celih brojeva.



Last modified: Wednesday, 20 March 2019, 7:44 PM