teilstring



  • hallo, ich versuche grad eine Fkt. zu schreiben, welche aus einem String einen Teilstring raussuchen und speichern soll...
    z.B. habe ich einen String:

    char string[] = "hallo, ihr da, willkommen im Forum";
    

    ich möchte nun eine Fkt. schreiben, die aus dem String z.B. den Teilstring ab dem Wort "da" für 8 Zeichen bildet...

    Ich habe auch schon angefangen, weiß aber nicht so recht weiter.
    So rufe ich diese Funktion erst mal auf:

    char *teilstring = teilst("hallo, ihr da, willkommen im Forum","da", 10);
    

    dabei ist der erste Parameter der String, der zweite der Suchstring, und der dritte die länge, die in den Speicher soll.

    Bisher habe ich es so versucht, leider ohne Erfolg:

    char *teilstr(char *inp, char *pos, int len)
    {
    	int stat=0;
    	char* p;
    	char* buffer={0};
    	p=strstr(inp, pos);
    	if(!p)
    	{
    		return inp;
    	}
    
    	while(p)
    	{
    		strncpy(buffer, pos, len);
    		stat++;
    	}
    
    	printf("%d\n",stat);
    	return buffer;
    }
    

    Kann mir jemand helfen? Gruß Kju-Q



  • willst unbedingt deine funktion verwenden ? denn sowas gibt es schon
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_wcecrt4/html/erlrfstrtokcmawcstok.asp



  • Probiers mal damit
    die funktion strfind ist irgendwo aus meinem Fundus und sucht einen Teilstring
    in einem String und liefert dessen Position zurück, bei nicht finden ist es eine
    -1.
    strncpy ist eine Funktion aus der Runtimelibrary, sie kopiert von source nach
    destination die angegebene Anzahl von Buchstaben bzw bis zum Stringende.
    Buffer+test zeigt auf die Fundstelle im String

    int teilst(char *in, // Inputstring
               char *out, // Outputstring
               char *pattern, // zu suchendes Pattern
               int Anzahl)    // Anzahl zu kopierender Characters
    {
    int test;
    test=strfind (in,pattern);
    if (-1 != test)
       strncpy(in+test,out,Anzahl);
    else
      return -1;
    return 0;
    }
    
    int strfind(char *ps, char *pt)
    {
      int i,k,itemp,slen,tlen;
    
      if((!(tlen=strlen(pt))) || (tlen>(slen=strlen(ps))) )
      {
        return (-1);
      }
      i=k=itemp=0;
      while (1) {
        if (ps[i]==pt[0]) {
          itemp=i;
          while(1) {
            if((k+1)==tlen)
              return (int)itemp;
            else if((i+k+1)==slen)
              return (-1);
            else {
              ++k;
              if(ps[i+k]!=pt[k]) {
                k=0;
                goto point1;
              }
            }
          }
        } else {
          if(!ps[i])
            return(-1);
          point1:
          ++i;
        }
      }
    //  return i;
    }
    

    🙂



  • Oder man verwendet gleich anstatt die selbstgeschriebene strfind() die Standardfunktion strstr() (findet einen Teilstring in einen String und liefert einen Zeiger auf die erste Position des Teilstrings)



  • Danke für den Hinweis, strstr habe ich bisher micht benutzt, die Beschreibung ist etwas eigenartig.

    Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.

    das hatte sich für mich immer so angehört das er wenn er alle Buchstaben aus dem strCharSet gefunden hat -unabhängig von Position und Reihenfolge- er mit der Position des ersten Zeichens zurückkommt.

    habs ausprobiert

    int teilst(char *in, // Inputstring
               char *out, // Outputstring
               char *pattern, // zu suchendes Pattern
               int Anzahl)    // Anzahl zu kopierender Characters
    {
    char * test;
    test=strstr (in,pattern);
    if (NULL == test)
     return -1; // not found
    else
       strncpy(out,test,Anzahl);
    return 0;
    }
    

    funktioniert und müsste theoretisch schneller sein.
    😃



  • Danke, funktioniert bestens...



  • Wie kann ich das jetzt noch ändern, dass wenn mehrere dieser Suchstrings enthalten sind, sie alle in einer Variable gespeichert und untereinander auf dem Bildschirm ausgegeben werden 😕
    Bisher wird lediglich der erste gefundene String (+ n Zeichen) in out gespeichert.



  • Am besten änderst du dazu die Funktion teilst() folgendermaßen um:

    char *teilst(char *in, // Inputstring
               char *out, // Outputstring
               char *pattern, // zu suchendes Pattern
               int Anzahl)    // Anzahl zu kopierender Characters
    //Rückgabewert ist die Stelle, an der pattern im Inputstring gefunden wurde (Zeiger)
    //Wenn pattern nicht gefunden wurde, dann wird NULL (0) zurückgegeben
    {
       char * test;
    
       test=strstr (in,pattern);
       if (NULL == test)
          return NULL; // not found
       else
          strncpy(out,test,Anzahl);
    
       return test;
    }
    

    Nun musst du die Funktion in eine Schleife einbauen, die überprüft, ob teilst() den Suchstring gefunden hat. Der Parameter für den Inputstring sollte dann allerdings immer ein Zeiger (ich nenn ihn jetzt mal akt) auf die hinter der zuletzt gefundenen Stelle sein.
    Du musst also vor der Schleife noch einen Zeiger auf deinen bisherigen Inputstring setzen. Dann in der Schleifenbedingung teilst() aufrufen und den Rückgabewert in einer Variablen speichern und auswerten. Wenn der Suchstring gefunden wurde, dann machst du deinen Code, der in dem Fall gemacht werden muss und setzt dann deinen Zeiger akt auf den gemerkten Rückgabewert von teilst() + 1 (bzw. die Länge des Suchstrings; wie es dir beliebt).
    Somit wanderst du im String immer weiter nach hinten, bis der Suchstring eben nicht mehr gefunden werden kann.


Anmelden zum Antworten