Показивачи и стрингови – неколико решених примера

Када једном декларишемо

char S[100];

променљива S је поље (односно низ знакова), али је S и показивач типа char* који показује на први елеменат низа знакова (знак са индексом 0, тј. S[0]), односно чува адресу првог елемента. Због тога се у позивима функција уместо char S[] може писати char *S.

Пример: Напишите функцију која рачуна дужину стринга. Функција као параметар прима стринг, а као резултат враћа дужину:

int duzina( char *s )
 {
      int i;
      for( i = 0; s[i]!=''; i++ );
      return i;
 }

У овом примеру смо параметар декларисали као показивач, али га унутар функције користимо као низ знакова!


Пример: Напишите функцију која рачуна дужину стринга. Функција као параметар прима стринг, а као резултат враћа дужину.
У овом примеру ћемо користити показивач и за декларацију параметра функције и унутар самог тела функције:

int duzina2( char *s )
 {
      int i=0;
      while( *s++ != '' ) i++;
      return i;
 }

Објашњење: Да бисмо одредили дужину стринга треба пролазити знак по знак стринга све док се не наиђе до знака ''. Тада је стринг готов и ту морамо прекинути бројање. Како је то овде постигнуто? Променљива ‘i’ глуми дужину стринга; пре него што почнемо бројати знакове у стрингу, дужину стринга постављамо на нулу. Улазимо у петљу while, коју ћемо привремено написати мало другачије:

while( *s != '' ) {s++; i++;}

Шта је *s? s је показивач на знак што значи да *s представља сам тај знак, односно *s је знаковна променљива (тип char!). По позиву функције s прима адресу првог знака у знаковном пољу (знак са индексом 0). Значи, прво испитујемо да ли је знак са индексом 0 различит од нуле? Ако јесте излазимо из петље. Иначе повећавамо дужину стринга (i) за један, и повећавамо s за један. Сада s показује на следећи знак (s[1]). Враћамо се на почетак while petlje. Сада испитујемо да ли је знак s[1] различит од ‘‘. Ако јесте излазимо из петље. Иначе повећавамо дужину стринга (i) за један, и повећавамо s за један… све док не дођемо до n-тог знака који ће бити једнак нули чиме ћемо изаћи из петље.


Пример: Напишите функцију која копира један стринг у други. Функција не враћа ништа.

void Kopiraj( char Odrediste[], char Izvor[] )
 {
      while(*Odrediste++=*Izvor++);
 }

Објашњење:
Погледајмо шта се догађа унутар while петље. *Odrediste је први знак одредишног низа, тј. знаковна променљива. *Izvor; је први знак изворног низа, тј. знаковна променљива. Најпре се први знак из изворног стринга копира у први знак одредишног стринга (*Odrediste=*Ishodiste). Затим се испита да ли је тај копирани знак различит од нуле (ако није наведен никакав услов подразумева се да се проверава да ли је != 0). Ако је знак једнак нули, излази се из петље и копирање је завршено. Иначе се врши увећавање показивача Odrediste i Izvor за један. Тиме оба показивача сада показују на други знак. Опет се врши while, који поновно копира знак, пореди са нулом итд. Копирање се прекида када се прекопира завршни знак – ознака за крај стринга!


Пример: Напишите функцију која додаје нови стринг на постојећи.

void Dodaj( char *Odrediste, char *Izvor )
 {
      while(*Odrediste) Odrediste++;
      while(*Odrediste++=*Izvor++);
 }

Објашњење:
Прво треба наћи крај старог стринга, и онда на крај ископирати нови стринг.
Прва while петља непрестано испитује да ли је знак из Odrediste нула и прекида се када је тај услов испуњен (односно кад стигне до краја стринга!), иначе се показивач увећава на следећи знак, итд. Друга while петља је копирање објашњено у претходном примеру.


Пример: Напишите функцију која тражи задани знак у стрингу. Ако он постоји, вратити његову адресу, ако не постоји, вратити NULL показивач. (показивач чија је вредност 0, одговара знаку за крај стринга ‘‘)

char *TraziZnak( char *Niz, char Znak )
 {
      do
      {
           if( *Niz == Znak ) return Niz;
      } while( *Niz++ );
      return NULL;
 }

Објашњење:
Испитујемо да ли је знак на који показује Niz једнак заданом; ако јесте, враћамо ту адресу и тиме се функција прекида. Иначе се испитује да ли је знак ‘‘. Ако јесте, излази се из петље; у супротном показивач се повећава тако да показује на следећи знак и све иде испочетка. Ако стигнемо до ‘‘, излазимо из петље, а то значи да тражени знак нисмо пронашли, па враћамо NULL.

делови текста преузети са адресе RAD SA STRINGOVIMA

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s