Citat:
kish:
Code:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
char * c1;
char * c2;
int main()
{
c1="prvi";
c2="drugi";
strcat(c1,c2);
cout<<c1<<endl;
return 0;
}
Kad stigne do
strcat program se prekida, javlja se greska i nista...
Don't send...
Linija
Code:
c1="prvi";
rezervise 5 bajta memorije (1 znak je jedan bajt dakle 4 bajta, plus jos jedan bajt za 0, sto zahtevaju mnoge funkcije za rad sa nizovima karaktera -
stringovima),
Code:
c2="drugi";
rezervise 6 bajta memorije,
Code:
strcat(c1,c2);
funkcija
strcat() fokusava da ceo niz
c2 od 5 bajta (0 ce se samo dodati umesto vec postojeceg u
c1 na kraju tako da se ne racuna) smesti iza slova 'i' u
c1.
Znaci potrebno je da
c1 ima rezervisano 10 bajta memorije (4 za rec "prvi", 5 za rec "drugi" i 1 za 0 terminirajuci znak), ali
c1 je rezervisao samo 5 bajta memorije, sto znaci da ce funkcija da pokusa da pise "iza" memorije koja je rezervisana za
c1, tj. u eventualno tudjoj memoriji, sto ce izazvati gresku/izuzetak -
Segmentation fault.
Iz objasnjenja za funkciju
strcat() izmedju ostalog pise:
Citat:
The strings may not overlap, and the dest string must have enough space for the result.
Ako hoces da ovo uradis u tzv. C++ maniru onda koristi klasu
std::string u suprotnom (ako ti treba u tom obliku) moras da obezbedis dovoljno memorije u _odredisnom_ nizu. Npr.
Code:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
char * c1;
char * c2;
int main()
{
c1="prvi";
c2="drugi";
char buf[strlen(c1)+strlen(c2)+1];
strncpy(buf, c1, strlen(c1)+1); // broju koji vrati "strlen()" dodaj jos 1 da bi kopirao i 0 iz "c1"
strcat(buf,c2);
cout<<buf<<endl;
}