1. String je u stvari polje znakova, niz znakova.
2. Svaki string se završava sa '\0'.
3. Deklaracija
char s1[] = {‘s’, ‘t’, ‘r’,’i’,’n’,’g’,’ ’, ‘1’ ‘\0’};
char s2[] = "string 2";
char *s3 = "string 3";
char s4[10] = "string 4"
Nije dozvoljena deklaracija bez inicijalne dodele vrednosti ? Osim u slučajevima:
char string1[15];
char *string2;
4. prikaz stringa
printf("%s",string);
5. Unos nove vrednosti, promena vrednosti
//za deklaracije
char s1[] = {‘s’, ‘t’, ‘r’,’i’,’n’,’g’,’ ’, ‘1’ ‘\0’};
char s2[] = "string 2";
char s4[10] = "string 4"
scanf("%s",string); //OK ukoliko se ne unese duzi "niz" od inicijalnog - poruka o gresci 1
//za deklaraciju
char *s3 = "string 3";
s3 = "string03"; //OK i za duze "nizove" od originala
Poruka o grešci 1
originalna rec ...>>> zdravo
izmeni rec... zdravo1234567890
rec izmenjena sa scanf ... zdravo1234567890
originalna rec ...>>> zdravo
izmeni rec...
rec izmenjena sa dodelom vrednosti .... ZDRAVO-duzeodoriginala
unesi neko ime... ime-neko
Ime: ime-neko
Prezime: neko_prezime
*** stack smashing detected ***: ./mojc.out terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0x7540a0]
/lib/i386-linux-gnu/libc.so.6(+0xe704a)[0x75404a]
./mojc.out[0x80485ec]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x683e37]
./mojc.out[0x8048401]
======= Memory map: ========
003a7000-003c1000 r-xp 00000000 08:07 875 /lib/i386-linux-gnu/libgcc_s.so.1
003c1000-003c2000 r--p 00019000 08:07 875 /lib/i386-linux-gnu/libgcc_s.so.1
003c2000-003c3000 rw-p 0001a000 08:07 875 /lib/i386-linux-gnu/libgcc_s.so.1
0066d000-007c9000 r-xp 00000000 08:07 6315 /lib/i386-linux-gnu/libc-2.13.so
007c9000-007cb000 r--p 0015c000 08:07 6315 /lib/i386-linux-gnu/libc-2.13.so
007cb000-007cc000 rw-p 0015e000 08:07 6315 /lib/i386-linux-gnu/libc-2.13.so
007cc000-007cf000 rw-p 00000000 00:00 0
008b6000-008b7000 r-xp 00000000 00:00 0 [vdso]
00e03000-00e1f000 r-xp 00000000 08:07 6312 /lib/i386-linux-gnu/ld-2.13.so
00e1f000-00e20000 r--p 0001b000 08:07 6312 /lib/i386-linux-gnu/ld-2.13.so
00e20000-00e21000 rw-p 0001c000 08:07 6312 /lib/i386-linux-gnu/ld-2.13.so
08048000-08049000 r-xp 00000000 08:07 573667 /home/emma/mojc.out
08049000-0804a000 r--p 00000000 08:07 573667 /home/emma/mojc.out
0804a000-0804b000 rw-p 00001000 08:07 573667 /home/emma/mojc.out
08e74000-08e95000 rw-p 00000000 00:00 0 [heap]
b774b000-b774c000 rw-p 00000000 00:00 0
b7760000-b7764000 rw-p 00000000 00:00 0
bfb16000-bfb37000 rw-p 00000000 00:00 0 [stack]
Aborted
Kao što se vidi, kod se izvršio ali na kraju je poruka o grešci.
Šta raditi u slučaju kada je potrebno nešto ovako:
char string1[] = "string 1";
printf("Unesi pravu vrednost stringa1 ... ");
scanf("%s", string1);
if (uslov)
string1 = "izraz 1";
else
string1 = "izraz 2";
printf("%s", string1);
Ima li nekog elegantnog rešenja?
osim varijanti:
1. Koristiti za svaku situaciju posebne promenljive (stringove):
- Kada je potreban unos sa tastature, deklarisati sa char string[] = <neka vrednost>; i pri deklaraciji dodeliti proizvoljnu vrednost tako da bude duža od najdužeg mogućeg unosa; ili sa char string[n]; gde je n za 1 veće od maksimalno očekivane dužine "niza".
- Kada se očekuje promena stringa unutar programskog koda bez spoljnog unosa, deklarisati sa char *string
2. Napraviti f-ju / f-je koje će rešiti problem.