Predavanje 7 - Stringovi I

1. Osnovno o stringovima

String mozemo definirati kao niz karaktera koji zavrsava sa karakterom koji oznacava kraj stringa (eng. string termination character) '\0' koji ima vrijednost nula.
Ovakva apstraktna definicija omogucuje vise razlicitih implementacija stringa u C-u. Npr. koristeci polja ili vezane liste. Mi cemo opisati implemetaciju koristeci polja. Ta implementacija je ugradjena u C. Stringovi su korisni iz dva osnovna razloga:


Razlika izmedju polja i stringova je u tome da polja uvijek imaju fiksnu duljinu specificiranu kod kreiranja polja dok se duljina stringa moze mijenjati tokom izvodjenja programa.
Memorija za string se rezervira ili kod prevodjenja programa (eng. compile time) deklarirajuci polje karaktera fiksne duljine ili tokom izvrsavanja progama pozivajuci funkciju malloc.
Kada je memorija alocirana za string onda ga popunjavamo karakterimna od pocetka i obavezno zavrsimo sa karakterom za kraj string \0, jer ako to ne ucinimo string nije nista drugo nego niz karaktera. Neki nacini inicijaliziranja stringa su ovdje.
#include<stdio.h> int main(){ int i; char p; char* ime="jezik"; /* moze i ovako, ali moramo voditi racuna da imamo dovoljno mjesta za nase karaktere i \0: zato deklariramo kao polje od 5+1=6 elemenata char ime[6]="jezik"; i ovaj je nacin dobar char ime[]="jezik"; Razlika izmedju char ime[]="jezik";, char ime[6]="jezik"; i char* ime="jezik"; je da pojedine karaktere u prvom i drugom slucaju mozemo mijenjati npr. ime[0]='J'; dok u trecem slucaju je to greska jer je string konstantan, odnosno radi se samo o pokazivacu na string konstantu. */ /* ispismo van pojedine karaktere stringa i njihove vrijednosti */ for(i=0; ime[i]!='\0'; i++) printf("%c; %d\n", ime[i], ime[i]); printf("Uocimo vrijednost zadnjeg karakera kojeg je sistem sam dodao na kraj: %d\n", ime[i]); while(*ime){ printf("%c; %d\n", *ime, *ime); ++ime; } /* da u istom programu ponovo ispisemo string moramo ga inicijalizirati jos jednom */ printf("Jos jedan nacin.\n"); ime="jezik"; while(p=*ime++) printf("%c; %d\n", p, p); return 0; }

2. Elementartne operacije na stringovima

Sistemsko zaglavlje <string.h> sadrzi funkcije koje se koriste za rad sa stringovima. Mi cemo pokazati jednu mogucu implementaciju za neke interesantne.


3. Zadaci za vjezbu (tezi zadaci oznaceni zvijezdicom)

1. Ponovite I/O funkcije iz sistemskog zaglavlja <stdio.h>.

2. Napisite program koji ucitava string sa komandne linije i provjerava pojavljuje li se u velikom stringu kojeg se ucitava sa standadnog inputa. Ogranicite duljinu velikog stringa na najvise 1000 karaktera.

3. Napisite program koji ucitava string sa komandne linije i ispituje pojavljuje li se u danoj datoteci cije se ime ucitava sa komandne linije.

4. Napisite sucelje koje implementira osnovne operacije sa stringovima. Implementirajte to sucelje koristeci elementarne algoritme za procesiranje stringova koristeci polja. Napisite i test program koji testira svaku funkciju tog sucelja.

5. Napisite sucelje koje implementira osnovne operacije sa stringovima. Implementirajte to sucelje koristeci elementarne algoritme za procesiranje stringova koristeci pokazivace. Napisite i test program koji testira svaku funkciju tog sucelja.

6. Napisite potprogram koji kao ulazni argument prima string, a vraca realni broj. Potprogram pretpostavlja da se u stringu nalazi dekadski zapis realnog broja (xxxx.xxxx) kojeg treba prebaciti u varijablu tipa float, sa odgovarajucom vrijednosti. Vodece bijeline u stringu se trebaju preskociti, i trebaju se pravilno obraditi eventualni predznak i tocka. Ukoliko se u stringu ne nalazi zapis broja, potprogram treba vratiti nulu. Napisite i test program koji ucitava string sa standardnog ulaza i testira rad potprograma.

7. Napisite potprogram koji kao ulazni argument prima realni broj i broj decimala, a vraca string. Potprogram treba ralni broj prebaciti u string, tako da on sadrzi dekadski zapis tog broja sa odgovarajucim brojem decimala. Trebaju se pravilno obraditi eventualni predznak i tocka. Napisite i test program koji ucitava realni broj sa standardnog ulaza i testira rad potprograma.

8.* Napisite program koji ucitava string i ispisuje popis svih rijeci koje se pojavljuju u tom stringu, sortiranih leksikografski, zajedno sa brojem pojavljivanja u stringu.