You are on page 1of 39

Staa Vujii

as 12
V 1.1
Niska karaktera ili string je niz karaktera
koji se zavrava karakterom '\0'.
Karakter '\0' ima ASCII vrednost 0 pa se moe
tumaiti kao logika vrednost netano.

2
Format za ispis niske pomou funkcije printf
je %s.
Konstante tipa niska se navode izmeu
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 moe sadrati sve karaktere, ne samo


slova
Svaki string se zavrava simbolom \0 string
terminator
TAMPANjE STRINGOVA

Bez obzira kako je string deklarisan I


inicijalizovan, uvek se moe tampati ovako:

printf (s1 = %s\n, s1);


UITAVANjE STRINGOVA
char s1[MAX];

char *s2;

scanf(%s, s1); OK, ako je uitan string duine <MAX

scanf(%s, s2); !POGRENO: Segmentation fault

! %s uitava 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],

pokazivaki:
karakteri stringa: *s, *(s+1),
Adrese karaktera: s, s+1,
Kakva je razlika izmeu s i s?

sje karakter
s je string ili niz od dva karaktera 's' i '\0'.

8
Obrni string - obre 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
Izvriti 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 '\0' */
for (i = 0; src[i]!='\0'; i++)
dest[i]=src[i];
}

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

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

18
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"));
}
19
Izlaz:
Zdravo
Zdravo svima
4
5
0
5
2
-1

20
Funkcijakoja 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';
}
21
main()
{
char niz[20];
char c;
printf("Unesi karakter\n\n");
scanf("%c", &c);
scanf("%s", niz);
sazimanje(niz, c);
printf("%s\n", niz);
}
22
Funkcija
za uitavanje rei 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.
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';
}
24
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);
}

25
Program na osnovu niske cifara broja u
dekadnom zapisu izraunava vrednost broja,
kao i obrnuto: na osnovu vrednosti broja
formira string koji sadri 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, 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';

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

for (i = 0; s[i] != '\0'; i++)


putchar (s[i]);

putchar ('\n');
}
28
/* 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, 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')
{
a = 10 * a + *s - '0';
s++;
}

/* Vracamo vrednost broja */


return znak * a;
}

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

32
for (q = cifre; *q != '\0'; 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, 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 = -a;
znak = -1;
}

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

/* "Zatvaramo" string, na propisan nacin */


*s = \0;

/* Obrcemo karaktere stringa */


obrni (cifre);
}
37
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);
38
/* 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

You might also like