Wörter auslesen



  • // Sucht b in a.
    char* my_strstr( char* a, char *b)
    {
    ...
    }
    

    🙂



  • ich hab mir mal ne eigene strstr funktion in c geschrieben, ist ne weile her muss ich mal suchen ... dann kann ich die mal posten



  • compare(s1, s2)
    {
      while (*s1 == *s2++)
      {
        if (*s1++ == 0)
        return (0);
      }
      return (-1);
    }
    So etwas kannst so nehmen...
    


  • mystr schrieb:

    ich hab mir mal ne eigene strstr funktion in c geschrieben, ist ne weile her muss ich mal suchen ... dann kann ich die mal posten

    suchst du immer noch? 😃

    ich hab mich auch mal daran versucht:

    // Sucht b in a. 
    // Bei erfolgreicher Suche wird der Zeiger auf das erste Vorkommen von b in a zurückgegeben, sonst NULL.
    char* my_strstr(char* a, char *b)
    {
    	if(*a==0||*b==0) return NULL; // Pathologische Fälle ausschließen.
    	while(*a)
    	{
    		if(*a==*b)
    		{
    			char* c=a, *d=b;
    			while(*a&&*b)
    			{
    				if(*a!=*b)
    					return NULL;
    				a++, b++;
    			}
    			if(*b==0) return c; // Das erste Vorkommen von b in a wurde gefunden.
    			b=d, a=c+1;
    		}
    		a++;
    	}
    	return NULL; // b ist nicht in a vorhanden.
    }
    
    int main()
    {
    	char* a = "123annalytiker", *b = "anna", *d = my_strstr(a, b);
    
    	if(d==NULL)
    	{
    		printf("%s not found in %s\n", b, a);
    		return 0;
    	}
    
    	puts(a);
    	while(a<d)
    		putchar(' '), a++;
    	putchar('^'), puts("");
    	return 0;
    }
    

    🙂



  • [Klugscheiß]
    Klar, es ist deine strstr-Funktion.
    Für den Standard ist der Fall, wenn b leer ist, falsch behandelt.
    Dann ist b auf alle Fälle in a enthalten.

    if(*b==0) return a;
    

    [\Klugscheiß]



  • du meinst

    if(*b==0) return 0;
    

    ? :p
    stimmt, die nullbytes habe ich von der suche ausgeschlossen, denn ein nullbyte
    soll ja nur das ende des strings markieren und nicht ein teil des strings sein.
    soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?

    🙂



  • achne, das war käse, es soll ja ein zeiger zurückgegeben werden, also so in der art:

    return a+strlen(a);
    

    🙂



  • B.B. schrieb:

    du meinst

    if(*b==0) return 0;
    

    ? :p

    Nein ich meine

    if(*b==0) return a;
    

    Du gibts den Zeiger zurück, nicht den Offset.
    Der Leerstring ist schon am Anfang enthalten.



  • wenn b leer ist und a nicht, dann gebe ich a zurück? 😕



  • char *my_strstr(const char *s1, const char *s2)
    {
      const char *t = s2, *p = 0;
      if (!*s2)
        return (char*)s1;
      while (*s1)
      {
        if (*s1 == *t)
        {
          if (!p)
            p = s1;
          if (!*(++t))
            return (char*)p;
        }
        else
        {
          t = s2;
          p = 0;
        }
        ++s1;
      }
      return 0;
    }
    

    😃

    B.B. schrieb:

    soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?

    Gar nicht. Ein Draft gibt's hier:
    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf



  • cooky451 schrieb:

    Ein Draft gibt's hier:
    http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

    ah, supi, danke.

    🙂



  • DirkB schrieb:

    B.B. schrieb:

    du meinst

    if(*b==0) return 0;
    

    ? :p

    Nein ich meine

    if(*b==0) return a;
    

    Du gibts den Zeiger zurück, nicht den Offset.
    Der Leerstring ist schon am Anfang enthalten.

    Achsoo, es steht so im Standard

    If s2 points to a string with zero length, the function returns s1.

    sag das doch gleich 😃

    🙂



  • B.B. schrieb:

    If s2 points to a string with zero length, the function returns s1.

    sag das doch gleich 😃

    🙂

    Nur für dich:

    Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
    Frei mit Babelfish 😃



  • Sollte wohl auch einfacher gehen:

    const char *my_strstr(const char *s1, const char *s2)
    {
      while (*s1)
      {
        const char *a=s1++,*b=s2;
        while( *a && *b && *a==*b ) ++a,++b;
        if( !*b ) return s1-1;
      }
      return 0;
    }
    


  • DirkB schrieb:

    Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
    Frei mit Babelfish 😃

    im tschtandacht steht aber s1 😃

    okok warn scherz, ich habs jetzt gerafft auch wenns iwie unlogisch ist. :p



  • B.B. schrieb:

    ... auch wenns iwie unlogisch ist. :p

    Im Gegenteil, es ist logisch.



  • @Wutz
    Eigentlich nett, aber du bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger ist und meine Version müsste eigentlich schneller sein, da du Bereiche doppelt prüfst :p
    (Ok, wirklich messen kann man den Unterschied vermutlich nicht.)

    Edit:
    Verdammt, der Standard macht mich fertig.



  • Wutz schrieb:

    Sollte wohl auch einfacher gehen:

    const char *my_strstr(const char *s1, const char *s2)
    {
      while (*s1)
      {
        const char *a=s1++,*b=s2;
        while( *a && *b && *a==*b ) ++a,++b;
        if( !*b ) return s1-1;
      }
      return 0;
    }
    

    was daran einfacher ist kann ich nicht erkennen. du packst quasi meine erste if-abfrage in deine while-schleife rein.
    nagut, eine if-abfrage hast du dann immerhin insgesamt weniger drin :D.
    aber deutlich kürzer ist deine version jedenfalls und den trick *a=s1++ find ich auch gut, hut ab 👍, hätte von mir sein können. 😉 :p



  • cooky451 schrieb:

    ... aber du bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger ist ...

    Na und!
    Das passiert bei den Standardfunktionen auch.
    Du als Programmierer hast dafür zu sorgen, dass die Funktion keinen NULL-Zeiger bekommt.



  • DirkB schrieb:

    Das passiert bei den Standardfunktionen auch.

    Argh da habe ich etwas verwechselt, werde mich alsbald beschämt in meine Höhle verkriechen 😞


Anmelden zum Antworten