Staa Vujii as 12 V 1 1 Niska

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

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

 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” ! %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

 Izvršiti implementaciju funkcija strcpy, strcat, strcmp, strchr, strstr biblioteke string. h. #include <stdio.

Izvršiti implementaciju funkcija strcpy, strcat, strcmp, strchr, strstr biblioteke string. h. #include <stdio. h> /* strcpy - 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]; } 13

/* strcat - Nadovezuje string t na kraj stringa s. Pretpostavlja da u s

/* strcat - 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++); } 14

/* 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]; } 15

/* strchr - Pronalazi prvu poziciju karaktera c u stringu s, odnosno -1 ukoliko

/* strchr - Pronalazi prvu poziciju karaktera c u stringu s, odnosno -1 ukoliko s ne sadrzi c */ 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; } 16

/* 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 sadrzi 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; } 17

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

/* strstr - 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; } 18

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")); } 19

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

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

 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]=''; } 21

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); } 22

 Funkcija za učitavanje reči sa ulaza u nisku karaktera. #include <stdio. h> #include

Funkcija za učitavanje reči sa ulaza u nisku karaktera. #include <stdio. h> #include <ctype. h> /* Potrebno je zbog funkcije isspace. Funkcija isspace ispituje da li je karakter praznina (blanko, tabulator ili prelazak u novi red). Ona je definisana u okviru ctype. h */ 23

/* Funkcija ucitava rec sa standardnog ulaza i smesta je u niz karaktera s.

/* Funkcija ucitava rec sa standardnog ulaza i smesta je u niz karaktera s. Ovo uspeva zbog toga sto se po vrednosti prenosi adresa pocetka niza, a ne ceo niz */ void ucitaj_rec(char s[]) { int c, i = 0; while (!isspace(c=getchar())) s[i++] = c; s[i] = ''; } 24

main() { /* Obavezno je alocirati memoriju za niz karaktera */ char s[100]; ucitaj_rec(s);

main() { /* Obavezno je alocirati memoriju za niz karaktera */ char s[100]; ucitaj_rec(s); /* Format za ispis stringa se zadaje kao %s */ printf("%sn", s); } 25

 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. #include <stdio. h> #define MAX 12 26

/* 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] = ''; } 27

/* Funkcija ispisuje karaktere stringa */ void ispisi_string (char s[]) { int i; for

/* Funkcija ispisuje karaktere stringa */ void ispisi_string (char s[]) { int i; for (i = 0; s[i] != ''; i++) putchar (s[i]); putchar ('n'); } 28

/* 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++; 29

/* 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++; 30

/* 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; } 31

/* 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. */ 32

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; } } 33

/* 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; 34

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

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

/* 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); 36

/* 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); } 37

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); 38

/* 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: "); ispisi_string (cifre); } 39