400 likes | 602 Views
Programiranje 1 programski jezik c. Staša Vujičić Čas 12 V 1.1. Stringovi – osnovni pojmovi. 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”.
E N D
Programiranje 1 programski jezik c Staša Vujičić Čas 12 V 1.1
Stringovi – osnovni pojmovi • Niska karaktera ili string je niz karaktera koji se završava karakterom '\0'. • Karakter '\0' ima ASCII vrednost 0 pa se može tumačiti kao logička vrednost”netačno”.
Stringovi – osnovni pojmovi • Format za ispis niske pomoću funkcije printf je %s. • Konstante tipa niska se navode izmeđuznakova 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', '\0'}
DEKLARACIJA i INICIJALIZACIJA STRINGOVA char s1[] = {‘s’, ‘t’, ‘r’,’i’,’n’,’g’,’ ’, ‘1’ ‘\0’}; char s2[] = “string 2”; char *s3 = “string 3”; • String može sadržati sve karaktere, ne samo slova • Svaki string se završava simbolom ‘\0’ – string terminator
ŠTAMPANjE STRINGOVA • Bez obzira kako je string deklarisan I inicijalizovan, uvek se može štampati ovako: printf (“s1 = %s\n”, s1);
UČITAVANjE STRINGOVA char s1[MAX]; char *s2; scanf(“%s”, s1); OK, ako je učitan string dužine <MAX scanf(“%s”, s2); !POGREŠNO: “Segmentation fault” • ! %s učitava niz neblanko karaktera
PRISTUP KARAKTERIMA STRINGA char s=“neki string”; • indeksno: int i; karakteri stringa: s[0],s[1],… poslednji element je uvek ‘\0’ adrese karaktera: &s[0], &s[1],… • pokazivački: karakteri stringa: *s, *(s+1), … Adrese karaktera: s, s+1,…
8 Kakva je razlika između ’s’ i ”s”? ’s’ je karakter ”s” je string ili niz od dva karaktera 's' i '\0'.
Primer 5 • 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; }
/* 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; } }
main() { char s[] = "Zdravo svima"; obrni_string(s); printf("%s\n", s); } Izlaz: amivs ovardZ
Primer 6 • 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] = '\0'; return i; }
Primer 7 • Izvršiti implementaciju funkcija strcpy, strcat, strcmp, strchr, strstr bibliotekestring.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 iskopirankarakter '\0' */ for (i = 0; src[i]!='\0'; i++) dest[i]=src[i]; }
/* 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++); }
/* 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] == '\0') /* 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]; }
/* 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; }
/* 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; }
/* 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 smosve karaktere niske sub */ if (sub[j+1]=='\0') return i; /* Nije nadjeno */ return -1; }
main() {char s[100]; char t[] = "Zdravo"; char u[] = " svima"; kopiraj_string(s, t); printf("%s\n", s); nadovezi_stringove(s, u); printf("%s\n", s); printf("%d\n",string_char("racunari", 'n')); printf("%d\n",string_poslednji_char("racunari", 'a')); printf("%d\n",string_string("racunari", "rac")); printf("%d\n",string_string("racunari", "ari")); printf("%d\n",string_string("racunari", "cun")); printf("%d\n",string_string("racunari", "cna")); }
Izlaz: Zdravo Zdravo svima 4 5 0 5 2 -1
Primer 8 • 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]!='\0';i++) if(s[i]!=c) s[j++]=s[i]; s[j]='\0'; }
main() { char niz[20]; char c; printf("Unesi karakter\n\n"); scanf("%c", &c); scanf("%s", niz); sazimanje(niz, c); printf("%s\n", niz); }
Primer 4 23 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 */
24 /* 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] = '\0'; }
25 main() { /* Obavezno je alocirati memoriju za niz karaktera */ char s[100]; ucitaj_rec(s); /* Format za ispis stringa se zadaje kao %s */ printf("%s\n", s); }
Primer 9 26 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 brojau dekadnom sistemu. #include <stdio.h> #define MAX 12
27 /* 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] = '\0'; }
28 /* Funkcija ispisuje karaktere stringa */ voidispisi_string (char s[]) { int i; for (i = 0; s[i] != '\0'; i++) putchar (s[i]); putchar ('\n'); }
29 /* 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 */ intatoi_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, tada po potrebi azuriramopromenljivu znak, i prelazimo na sledeci karakter. */ if (*s == '-') { znak = -1; s++; } else if (*s == '+') s++;
31 /* 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 */ voidobrni (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 '\0', koji se ne smatra delom stringa. */
33 for (q = cifre; *q != '\0'; 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, 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 = -a; znak = -1; }
36 /* 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++ = ‘-‘; /* "Zatvaramo" string, na propisan nacin */ *s = ‘\0‘; /* Obrcemo karaktere stringa */ obrni (cifre); }
38 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 %d\n", a);
39 /* 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); }