Staa Vujii as 12 V 1 2 Niska

  • Slides: 40
Download presentation
Staša Vujičić Čas 12 V 1. 2

Staša Vujičić Čas 12 V 1. 2

 Niska karaktera ili string je niz karaktera koji se završava karakterom '�'. Karakter

Niska karaktera ili string je niz karaktera koji se završava karakterom ''. Karakter '' ima ASCII vrednost 0 pa se može tumačiti kao logička vrednost ”netačno”. 2

 Format za ispis niske pomoću funkcije printf je %s. Konstante tipa niska se

Format za ispis niske pomoću funkcije printf je %s. Konstante tipa niska se navode između znakova navodnika. Na primer: char s[]="Primer stringa"; Pri tome je s niska od 15 karaktera: {'P', 'r', 'i', 'm', 'e', 'r', 's', 't', 'r', 'i', 'n', 'g', 'a', ''} 3

char s 1[] = {‘s’, ‘t’, ‘r’, ’i’, ’n’, ’g’, ’ ’, ‘ 1’

char s 1[] = {‘s’, ‘t’, ‘r’, ’i’, ’n’, ’g’, ’ ’, ‘ 1’ ‘’}; char s 2[] = “string 2”; char *s 3 = “string 3”; String može sadržati sve karaktere, ne samo slova Svaki string se završava simbolom ‘’ – string terminator

 Bez obzira kako je string deklarisan I inicijalizovan, uvek se može štampati ovako:

Bez obzira kako je string deklarisan I inicijalizovan, uvek se može štampati ovako: printf (“s 1 = %sn”, s 1);

char s 1[MAX]; char *s 2; scanf(“%s”, s 1); OK, ako je učitan string

char s 1[MAX]; char *s 2; scanf(“%s”, s 1); OK, ako je učitan string dužine <MAX scanf(“%s”, s 2); !POGREŠNO: “Segmentation fault” (pogledati primere) ! %s učitava niz neblanko karaktera

char s[]=“neki string”; indeksno: int i; karakteri stringa: s[0], s[1], … poslednji element je

char s[]=“neki string”; indeksno: int i; karakteri stringa: s[0], s[1], … poslednji element je uvek ‘’ adrese karaktera: &s[0], &s[1], … pokazivački: karakteri stringa: *s, *(s+1), … Adrese karaktera: s, s+1, …

 Kakva je razlika između ’s’ i ”s”? ’s’ je karakter ”s” je string

Kakva je razlika između ’s’ i ”s”? ’s’ je karakter ”s” je string ili niz od dva karaktera 's' i ''. 8

 Obrni string - obrće nisku karaktera. #include <stdio. h> /* Ova funkcija racuna

Obrni string - obrće nisku karaktera. #include <stdio. h> /* Ova funkcija racuna duzinu date niske karaktera. Umesto nje, moguce je koristiti standardnu funkciju strlen. */ int duzina_stringa(char s[]) { int i; for (i = 0; s[i]; i++); return i; } 9

/* Funkcija obrce nisku karaktera */ void obrni_string(char s[]) { int i, j; for

/* Funkcija obrce nisku karaktera */ void obrni_string(char s[]) { int i, j; for (i = 0, j = duzina_stringa(s)-1; i<j; i++, j--) { int pom = s[i]; s[i] = s[j]; s[j] = pom; } } 10

main() { char s[] = "Zdravo svima"; obrni_string(s); printf("%sn", s); } Izlaz: amivs ovard.

main() { char s[] = "Zdravo svima"; obrni_string(s); printf("%sn", s); } Izlaz: amivs ovard. Z 11

 Uklanja beline, tabulatore ili znak za kraj reda sa kraja stringa. int ukloni(char

Uklanja beline, tabulatore ili znak za kraj reda sa kraja stringa. int ukloni(char s[]) { int i; for (i = strlen(s)-1; i >= 0; i--) if (s[i] != ' ' && s[i] != 't' && s[i] != 'n') break; s[i+1] = ''; return i; } 12

 strcpy (string copy) char *strcpy(char *s 1, const char *s 2); strcpy kopira

strcpy (string copy) char *strcpy(char *s 1, const char *s 2); strcpy kopira string s 2 u string s 1 strcpy vraća pokazivač na prvi karakter stringa s 1 strcpy podrazumeva da je string s 2 dovoljno velik za smeštanje celog stringa s 1; neophodno je voditi računa o dimenziji niza s 1 (pogledati demonstraciju funkcije) !!! Stringovi se ne mogu kopirati naredbom dodele (npr s 1=s 2 je pogrešan način za kopiranje stringova) (pogledati primer)

 strcat (string concatanate) char *strcat(char *s 1, const char *s 2); strcat nadovezuje

strcat (string concatanate) char *strcat(char *s 1, const char *s 2); strcat nadovezuje string s 2 na string s 1 strcat vraća pokazivač na prvi karakter stringa s 1 strcat podrazumeva da je string s 2 dovoljno velik za smeštanje svih nadovezanih karaktera stringa s 1; neophodno je voditi računa o dimenziji niza s 1 (pogledati demonstraciju funkcije) (pogledati primer)

 strcmp (string compare) int strcmp(const char *s 1, const char *s 2); strcmp

strcmp (string compare) int strcmp(const char *s 1, const char *s 2); strcmp poredi dva stringa strcmp vraća: 0, ako je su s 1 i s 2 jednake <0, ako je s 1 leksikografski ispred s 2 (tj poredak s 1, s 2 jeste leksikografski ispravan) >0, ako je s 1 leksikografski iza s 2 (tj poredak s 1, s 2 nije leksikografski ispravan) !!! Stringovi se ne mogu porediti relacionim operatorima (npr s 1<s 2 je pogrešan način za poređenje stringova) (pogledati primer)

 strstr (string) char *strstr(const char *s 1, const char *s 2) strstr ispituje

strstr (string) char *strstr(const char *s 1, const char *s 2) strstr ispituje da li je niska s 2 podstring niske s 1 Ako jeste, strstr vraća adresu one pozicije u niski s 1 odakle počinje niska s 2; u suprotnom, vraća NULL (pogledati primer)

 strchr (string) char *strchr(const char *s 1, int c) strchr ispituje da li

strchr (string) char *strchr(const char *s 1, int c) strchr ispituje da li se karakter c nalazi u niski s 1 Ako se nalazi, strchr vraća adresu one pozicije u niski s 1 gde se karakter c prvi put pojavljuje; u suprotnom, vraća NULL (pogledati primer)

#include <stdio. h> /* Kopira string src u string dest. Pretpostavlja da u dest

#include <stdio. h> /* Kopira string src u string dest. Pretpostavlja da u dest ima dovoljno prostora. */ void kopiraj_string(char dest[], char src[]) { int i; /* Kopira karakter po karakter, sve dok nije iskopiran karakter '' */ for (i = 0; src[i]!=''; i++) dest[i]=src[i]; dest[i]=‘’; } 18

/* Nadovezuje string t na kraj stringa s. Pretpostavlja da u s ima dovoljno

/* Nadovezuje string t na kraj stringa s. Pretpostavlja da u s ima dovoljno prostora. */ void nadovezi_stringove(char s[], char t[]) { int i, j; /* Pronalazimo kraj stringa s */ for (i = 0; s[i]; i++); /* Vrsi se kopiranje, slicno f-ji kopiraj_string */ for (j = 0; s[i] = t[j]; j++, i++); s[i]=‘’; } 19

/* strcmp - Vrsi leksikografsko poredjenje dva stringa. Vraca : 0 - ukoliko su

/* strcmp - Vrsi leksikografsko poredjenje dva stringa. Vraca : 0 - ukoliko su stringovi jednaki <0 - ukoliko je s leksikografski ispred t >0 - ukoliko je s leksikografski iza t */ int uporedi_stringove(char s[], char t[]) { /* Petlja tece sve dok ne naidjemo na prvi razlicit karakter */ int i; for (i = 0; s[i]==t[i]; i++) if (s[i] == '') /* Naisli smo na kraj oba stringa, a nismo nasli razliku */ return 0; /* s[i] i t[i] su prvi karakteri u kojima se niske razlikuju. Na osnovu njihovog odnosa, odredjuje se odnos stringova*/ return s[i] - t[i]; } 20

/* Vraća indeks prvog pojavljivanja karaktera c u niski s ili -1 ako se

/* Vraća indeks prvog pojavljivanja karaktera c u niski s ili -1 ako se ne pojavljuje*/ int string_char(char s[], char c) { int i; for (i = 0; s[i]; i++) if (s[i] == c) return i; /* Nije nadjeno */ return -1; } 21

/* Pronalazi poslednju poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne

/* Pronalazi poslednju poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne sadrži c */ int string_poslednji_char(char s[], char c) { /* Pronalazimo kraj stringa s */ int i; for (i = 0; s[i]; i++); /* Krecemo od kraja i trazimo c unazad */ for (i--; i>=0; i--) if (s[i] == c) return i; /* Nije nadjeno */ return -1; } 22

/* Proverava da li string str sadrzi string sub. Vraca poziciju na kojoj sub

/* Proverava da li string str sadrzi string sub. Vraca poziciju na kojoj sub pocinje, odnosno -1 ukoliko ga nema */ int string_string(char str[], char sub[]) { int i, j; /* Proveravamo da li sub pocinje na svakoj poziciji i */ for (i = 0; str[i]; i++) /* Poredimo sub sa str pocevsi od poziciji i sve dok ne naidjemo na razliku */ for (j = 0; str[i+j] == sub[j]; j++) /* Nismo naisli na razliku a ispitali smo sve karaktere niske sub */ if (sub[j+1]=='') return i; /* Nije nadjeno */ return -1; } 23

main() {char s[100]; char t[] = "Zdravo"; char u[] = " svima"; kopiraj_string(s, t);

main() {char s[100]; char t[] = "Zdravo"; char u[] = " svima"; kopiraj_string(s, t); printf("%sn", s); nadovezi_stringove(s, u); printf("%sn", s); printf("%dn", string_char("racunari", 'n')); printf("%dn", string_poslednji_char("racunari", 'a')); printf("%dn", string_string("racunari", "rac")); printf("%dn", string_string("racunari", "ari")); printf("%dn", string_string("racunari", "cun")); printf("%dn", string_string("racunari", "cna")); } 24

 Izlaz: Zdravo svima 4 5 0 5 2 -1 25

Izlaz: Zdravo svima 4 5 0 5 2 -1 25

 Funkcija koja uklanja znak c kad god se pojavi u stringu s. #include

Funkcija koja uklanja znak c kad god se pojavi u stringu s. #include <stdio. h> void sazimanje(char s[], char c) { int i, j; for(i=j=0; s[i]!=''; i++) if(s[i]!=c) s[j++]=s[i]; s[j]=''; } 26

main() { char niz[20]; char c; printf("Unesi karakternn"); scanf("%c", &c); scanf("%s", niz); sazimanje(niz, c);

main() { char niz[20]; char c; printf("Unesi karakternn"); scanf("%c", &c); scanf("%s", niz); sazimanje(niz, c); printf("%sn", niz); } 27

 Program na osnovu niske cifara broja u dekadnom zapisu izračunava vrednost broja, kao

Program na osnovu niske cifara broja u dekadnom zapisu izračunava vrednost broja, kao i obrnuto: na osnovu vrednosti broja formira string koji sadrži zapis broja u dekadnom sistemu. (pogledati primer) #include <stdio. h> #define MAX 12 28

/* Funkcija ucitava string sa ulaza u niz na ciji pocetak pokazuje pokazivac s,

/* Funkcija ucitava string sa ulaza u niz na ciji pocetak pokazuje pokazivac s, duzine max karaktera */ void ucitaj_string (char s[], int max) { int c; int i; for (i = 0; (c = getchar ()) != EOF && c != ' ' && c != 't' && c != 'n' && i < max - 1; i++) s[i] = c; s[i] = ''; } 29

/* Funkcija vraca broj koji je zapisan u dekadnom obliku u stringu na koji

/* Funkcija vraca broj koji je zapisan u dekadnom obliku u stringu na koji pokazuje s. Na pocetku stringa su dozvoljene vodece beline, nakon cega sledi opcioni znak, i na kraju same cifre broja. Eventualni karakteri nakon cifara se ignorisu. Ova funkcija je identicna funkciji atoi() iz standardne biblioteke */ int atoi_klon (char s[]) { int a = 0; /* Promenljiva u kojoj akumuliramo vrednost */ int znak = 1; /* Znak (inicijalno +) */ /* Preskacemo beline */ while (*s == ' ' || *s == 't') s++; 30

/* Prvi ne-blanko karakter je ili cifra, ili znak. Ako je znak u pitanju,

/* Prvi ne-blanko karakter je ili cifra, ili znak. Ako je znak u pitanju, tada po potrebi azuriramo promenljivu znak, i prelazimo na sledeci karakter. */ if (*s == '-') { znak = -1; s++; } else if (*s == '+') s++; 31

/* Racunamo vrednost broja */ while (*s >= '0' && *s <= '9') {

/* Racunamo vrednost broja */ while (*s >= '0' && *s <= '9') { a = 10 * a + *s - '0'; s++; } /* Vracamo vrednost broja */ return znak * a; } 32

/* Funkcija obrni() obrce karaktere stringa */ void obrni (char cifre[]) { char *p

/* Funkcija obrni() obrce karaktere stringa */ void obrni (char cifre[]) { char *p = cifre, *q; /* Petlja postavlja q da pokazuje na poslednji karakter u stringu. Pri tom se pod poslednjim podrazumeva karakter pre znaka '', koji se ne smatra delom stringa. */ 33

for (q = cifre; *q != '�'; q++); q--; /* Obrtanje niza */ for

for (q = cifre; *q != ''; q++); q--; /* Obrtanje niza */ for (; p < q; p++, q--) { char t = *p; *p = *q; *q = t; } } 34

/* Funkcija na osnovu broja a kreira string sastavljen od dekadnih cifara broja a,

/* Funkcija na osnovu broja a kreira string sastavljen od dekadnih cifara broja a, sa eventualnim predznakom '-' */ void itoa (int a, char cifre[]) { int znak = 1; char *s = cifre; 35

/* Racunamo znak i apsolutnu vrednost */ if (a < 0) { a =

/* Racunamo znak i apsolutnu vrednost */ if (a < 0) { a = -a; znak = -1; } 36

/* Izdvajamo cifre zdesna u levo i smestamo ih u string. */ do {

/* Izdvajamo cifre zdesna u levo i smestamo ih u string. */ do { *s = a % 10 + '0'; a /= 10; s++; } while (a); 37

/* Dopisujemo znak, ako je '-' */ if (znak == -1) *s++ = ‘-‘;

/* Dopisujemo znak, ako je '-' */ if (znak == -1) *s++ = ‘-‘; /* "Zatvaramo" string, na propisan nacin */ *s = ‘‘; /* Obrcemo karaktere stringa */ obrni (cifre); } 38

int main () { char cifre[MAX]; int a; /* Ucitavamo string */ printf ("Uneti

int main () { char cifre[MAX]; int a; /* Ucitavamo string */ printf ("Uneti string oblika (+|-)dddd "); ucitaj_string (cifre, MAX); /* Dobijamo broj iz stringa */ a = atoi_klon (cifre); /* Prikazujemo broj */ printf ("Vrednost broja %dn", a); 39

/* Ucitavamo broj */ printf ("Unesite broj: "); scanf ("%d", &a); /* Kreiramo string

/* Ucitavamo broj */ printf ("Unesite broj: "); scanf ("%d", &a); /* Kreiramo string sa ciframa */ itoa (a, cifre); /* Prikazujemo string */ printf ("String sa ciframa broja: "); printf (“%s”, cifre); } 40