Frage zu "strtok"



  • Hallo,

    ich probiere gerade mit "strtok" herum und stoße auf ein Problem.
    Erstmal der Quellcode:

    char *ptr_sb;
    char *ptr_text;         
    ptr_text = strtok(str_dateiinhalt, "\n\t ");
    ptr_sb = strtok(str_sbinhalt, "\n\t ");
    
    while (ptr_text != NULL)
    {
    	while (ptr_sb != NULL)
    	{
    		if(strcmp(ptr_sb,ptr_text) == 0){
    			printf("%s wurde gefunden\n",ptr_text);
    		}
    		ptr_sb = strtok(NULL, "\n\t ");
    	}
    	ptr_text = strtok(NULL, "\n\t ");
    }
    

    Dies soll ein Suchprogramm werden. Es gibt 2 Strings.

    str_sbinhalt -> beinhaltet Suchbegriffe
    str_dateiinhalt -> beinhatet einen Text

    Es soll jedes Wort des Textes, in dem String der Suchbegriffe gesucht werden. Kommt das Wort drin vor gibt er es aus.

    Nur klappt das so nicht ganz, erläuft mit der äußeren Schleife nur einmal durch und das wars. Die innere geht soweit beim 1. durchlauf. Sprich er nimmt das 1. Wort des Textes und lässt es gegen jeden Suchbegriff laufen.

    Nun müsste er ja mit dem 2. Wort des Textes fortsetzen und nun wieder alle Suchbegriffe dagegenlaufen lassen aber wie ich sagte macht er das nicht.

    Wo liegt den der Fehler? 😞



  • probier mal strstr zum finden deines suchbegriffes...



  • Hallo Denis103,
    strtok hat das Problem, dass es intern eine statische Variable nutzt. Du kannst also strtok nicht gleichzeitig mit zwei verschiedenen Strings verwenden. Aus diesem Grund habe ich mir vor einiger Zeit mal eine eigene strtok Funktion geschrieben welche dieses Problem nicht hat.

    Ansonsten stimme ich Windalf zu.



  • Hallo,

    das müsste gut klappen, danke euch aber mir ist gerade was einfacheres eingefallen.

    Die Suchbegriffe stehen ja untereinander in der Textdatei. Sprich ich kann sie einzeln mit fgets in einen Sting hauen und diesen dann mit dem Text (strtok) einzeln vergleichen.

    So die Theorie, nur gibts da einen hacken. Fgets holt auch das "\n" in den String (weil die sie ja untereinander stehen) und das strtok liefert mir ja nur das reine Wort ohne "\n"

    Wenn ich sie nun vergleiche mit strcmp findet er keine Übereinstimmung.

    Wie kann ich denn das "\n" beim fgets entfernen?

    MfG
    Denis 🙂



  • @Denis103, die Frage hatten wir glaube ich vor einigen Tagen schonmal.

    char *pDt = ...              /* In pDt steht das eingelesene Wort */
    pDt[strlen( pDt )-1] = '\0'; /* Letztes Zeichen wird entfernt */
    


  • Jo klappt super!

    Ich danke Euch für eure schnelle Mithilfe! 👍


Anmelden zum Antworten