strtok: durchläuft nicht alle Felder



  • Hallo zusammen,

    mal eine kleine Frage zu der Funktion "strtok()". Ich benutze diese um eine mit ";" getrennte Liste zu durchlaufen. In der dafür vorgesehenen Schleife rufe ich eine weitere Funktion auf, die mir eine Überprüfung mit dem Wert durchführen soll, den mir strtok ermittelt hat. Für das erste Element in der Schleife funktioniert das auch, jedoch werden nachfolgende Elemente nicht mehr betrachtet, da strtok dann kein korrekten Rückgabewert mehr liefert.

    Hier mein Code dazu:

    static char* AddSomething(char *pString)
    {
    	char delimiter[] = ",;";
    	char *sResult = (char*)calloc(256, sizeof(char));
    	char sCopy[256] = {0x0};
    	char sAdditionalPrefixList[50] = {0x0};
    	char *ptrSearch;
    	char sTmp[15] = {0x0};
    
    	ptrSearch = strtok(pString, delimiter);
    
    	while (ptrSearch != NULL)
    	{
    
    		if(IsItemPartOfAdditionalPrefix(ptrSearch))
    		{
    			if(strlen(ptrSearch) == LENGTH_FIXTURE_NUMBER_SHORT)
    			{
    				sprintf(sTmp, "%s-XXX", ptrSearch);
    			}
    		}
    		else
    		{
    			strcpy(sTmp, ptrSearch);
    		}
    
    		if(strlen(sResult) > 0)
    			strcat(sResult, ";");
    
    		strcat(sResult, sTmp);
    
    		ptrSearch = strtok(NULL, delimiter);
    	}
    
    	return sResult;
    }
    
    static int IsItemPartOfAdditionalPrefix(char* sdocNo)
    {
    	int iret = 0;
    	char sAdditionalPrefixList[50] = {0x0};
    	char* ptr;
    	char sBuffer[15] = {0x0};
    
    	//step through the additional prefix list to compare it with sdocNo
    	strcpy(sAdditionalPrefixList, ADDITIONAL_PREFIX_LIST);
    	ptr = strtok(sAdditionalPrefixList, ",");
    
    	while(ptr != NULL)
    	{
    		if(strstr(sdocNo, ptr))
    		{
    			iret = 1;
    			break;
    		}
    
    		ptr = strtok(NULL, ",");
    	}
    
    	return iret;
    }
    

    Wo liegt mein Fehler?

    Als Argument für "AddSomething()" kommt z.B.

    "14-3456;2345-65463;229-3456"

    rein. Dabei wird dann nur das erste Elemente "14-3456" betrachtet und das zweite schon nicht mehr.

    Danke für die Hilfe!
    Gruß



  • strtok ist nicht threadsicher.
    Es speichert intern die letzte gefundene Stelle. Von dort wird weiter gemacht, wenn der erste Parameter NULL ist.

    Zudem verändert es den Eingabestring. An die Stellen von den Trennzeichen wird die '\0' geschrieben.



  • strtok ist nicht reentrant, das passt hier besser.


Anmelden zum Antworten