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);'

Reply via email to