Howdy!
On Tue, 26 Oct 1999, Tomaz wrote:
> char* strext(const char* haystack,const char* needle)
> {
> int len=strlen(needle);
> char *str;
> str=strstr(haystack,needle);
> if (str!=NULL) str[len]='\0';
> /*Ko se izvede stavke if ... se skrči haystack do najdenega podniza,
> in ta vrednost se vrne v glavni program.
> (npr. strcpy(st,"Konec koncev ima vse svoj konec.");
> s=strext(st,"ima"); po ukazu je st ="Konec koncev ima"
> s="ima"
> */
>
> return str;
> }
funkcija strstr ti ne skopira dela niza v novega, temvec le vrne kazalec
na del starega. Nekako takole:
Tole je en niz.\0
^ ^
| +-------------- kazalec na to pomnilnisko lokacijo vrne funkcija
| strstr (haystack, "en")
|
+---------------------- sem kaze kazalec *haystack
Torej, ko naredis tisti str[len]='\0' v resnici spreminjas vsebino
originalnega niza. Tisti const pri deklaraciji pramaterov pomeni, da
funkcija strext ne bo smela spreminjati vsebine kazalcev (torej ne bo
mogla prestaviti kazalca *haystack nekam drugam), prav nobene kontrole pa
nima nad pomnilnikom, kamor podani kazalec kaze.
Ce hoces haystack nespremenjen, bos moral narediti nekaj takega:
char* strext (const char* haystack, const char* needle)
{
int len;
char *str;
len=strlen(needle);
str=NULL;
if (strstr(haystack, needle)!=NULL) {
str=(char *)malloc((len+1)*sizeof(*str));
strncpy (strstr(haystack, needle), len);
str[len]='\0';
}
return (str);
}
Sicer pa bi bilo bolj enostavno (ampak najbrz goljufivo) takole:
char* strext (const char* haystack, const char* needle)
{
int len;
char *str;
len=strlen(needle);
str=NULL;
if (strstr(haystack, needle)!=NULL)
str=needle;
return (str);
}
Pa se v temle drugem primeru bi imel probleme, ko bi kje naprej naredil
free (str);
Peace!
Mkx
---- perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'