programiranje 1 programski jezik c
DESCRIPTION
Programiranje 1 programski jezik c. Staša Vujičić Čas 12 V 1.2. 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”. - PowerPoint PPT PresentationTRANSCRIPT
Staša VujičićČas 12
V 1.2
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”.
2
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', '\0'}
3
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 STRINGOVAchar s1[MAX];
char *s2;
scanf(“%s”, s1); OK, ako je učitan string dužine <MAX
scanf(“%s”, s2); !POGREŠNO: “Segmentation fault”
(pogledati primere) ! %s učitava niz neblanko karaktera
PRISTUP KARAKTERIMA STRINGAchar 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,…
Kakva je razlika između ’s’ i ”s”?
’s’ je karakter ”s” je string ili niz od dva karaktera 's' i
'\0'.
8
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 (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("%s\n", s);
}
Izlaz:amivs ovardZ
11
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;
}12
Funkcije biblioteke <string.h> strcpy (string copy)
char *strcpy(char *s1, const char *s2);
strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa
s1 strcpy podrazumeva da je string s2 dovoljno
velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)
!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)
(pogledati primer)
strcpy (string copy)
char *strcpy(char *s1, const char *s2);
strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa
s1 strcpy podrazumeva da je string s2 dovoljno
velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)
!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)
(pogledati primer)
strcpy (string copy)
char *strcpy(char *s1, const char *s2);
strcpy kopira string s2 u string s1 strcpy vraća pokazivač na prvi karakter stringa
s1 strcpy podrazumeva da je string s2 dovoljno
velik za smeštanje celog stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)
!!! Stringovi se ne mogu kopirati naredbom dodele (npr s1=s2 je pogrešan način za kopiranje stringova)
(pogledati primer)
strcat (string concatanate)
char *strcat(char *s1, const char *s2);
strcat nadovezuje string s2 na string s1 strcat vraća pokazivač na prvi karakter stringa s1 strcat podrazumeva da je string s2 dovoljno velik
za smeštanje svih nadovezanih karaktera stringa s1; neophodno je voditi računa o dimenziji niza s1 (pogledati demonstraciju funkcije)
(pogledati primer)
Funkcije biblioteke <string.h>
Funkcije biblioteke <string.h>
strcmp (string compare)
int strcmp(const char *s1, const char *s2);
strcmp poredi dva stringa strcmp vraća: 0, ako je su s1 i s2 jednake <0, ako je s1 leksikografski ispred s2 (tj poredak s1,s2 jeste leksikografski ispravan) >0, ako je s1 leksikografski iza s2 (tj poredak s1,s2 nije leksikografski ispravan) !!! Stringovi se ne mogu porediti relacionim operatorima
(npr s1<s2 je pogrešan način za poređenje stringova)
(pogledati primer)
Funkcije biblioteke <string.h>
strstr (string string)
char *strstr(const char *s1, const char *s2)
strstr ispituje da li je niska s2 podstring niske s1 Ako jeste, strstr vraća adresu one pozicije u niski
s1 odakle počinje niska s2; u suprotnom, vraća NULL
(pogledati primer)
Funkcije biblioteke <string.h>
strchr (string string)
char *strchr(const char *s1, int c)
strchr ispituje da li se karakter c nalazi u niski s1 Ako se nalazi, strchr vraća adresu one pozicije u
niski s1 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 ima dovoljno prostora. */
void kopiraj_string(char dest[], char src[]){
int i;/* Kopira karakter po karakter, sve dok nije iskopiran
karakter '\0' */for (i = 0; src[i]!='\0'; i++)
dest[i]=src[i]; dest[i]=‘\0’;}
18
/* 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]=‘\0’;}
19
/* 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]; }
20
/* 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 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 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]=='\0')return i;
/* Nije nadjeno */return -1;
}
23
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"));}
24
Izlaz:ZdravoZdravo svima45052-1
25
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';
}
26
main() {
char niz[20];char c;printf("Unesi karakter\n\n");scanf("%c", &c);scanf("%s", niz);sazimanje(niz, c);printf("%s\n", niz);
}
27
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, 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';
}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 */
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, 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') { a = 10 * a + *s - '0'; s++; }
/* Vracamo vrednost broja */ return znak * a;}
32
/* 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 '\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: "); printf (“%s”, cifre);}
40