2009-10-02 13 views
11

Próbuję użyć strtok() w zagnieżdżonej pętli. Ale to nie daje pożądanych rezultatów. Prawdopodobnie dlatego, że używają tej samej lokalizacji pamięci. Mój kod ma postać: -Używanie strtok() w pętli w C?

char *token1 = strtok(Str1, "%"); 
while(token1 != NULL) 
{ 
    char *token2 = strtok(Str2, "%"); 
    while(token2 != NULL) 
    { 
     //DO SMTHING 
     token2 = strtok(NULL, "%"); 
    } 
    token1 = strtok(NULL, "%"); 
    // Do something more 
} 
+0

Więc teraz wiesz, dlaczego ludzie nie używają 'strtok()', czy mogą go uniknąć. Trudno jest go właściwie użyć. –

Odpowiedz

19

Tak, strtok() rzeczywiście wykorzystuje część pamięci statycznej, aby zapisać swój kontekst pomiędzy wywołaniami. Zamiast tego użyj wersji wielokrotnej strtok(), strtok_r() lub strtok_s(), jeśli używasz VS (identyczne z strtok_r()).

Ma dodatkowy argument kontekstowy i można używać różnych kontekstów w różnych pętlach.

char *tok, *saved; 
for (tok = strtok_r(str, "%", &saved); tok; tok = strtok_r(NULL, "%", &saved)) 
{ 
    /* Do something with "tok" */ 
} 
+2

Jeśli nie edytujesz przyczyny, dlaczego 'strtok' zachowuje się w ten sposób, oto kilka informacji na temat' strtok_r': http://www.mkssoftware.com/docs/man3/strtok_r.3.asp – Welbog

+0

@ ChrisF: Problem nie jest ogranicznikiem lub miejscem przechowywania żetonów, ale faktem, że 'strtok' może w dowolnym momencie oznaczyć tylko jeden ciąg znaków. 'strtok_r' rozwiązuje ten problem, używając innego parametru do zapisania jego stanu. – Welbog

+0

Czy ktoś mógłby wyjaśnić, jak działa powyższa pętla? – MortalMan

1

strtok używa statycznego bufora. W twoim przypadku powinieneś użyć strtok_r. Ta funkcja wykorzystuje bufor dostarczony przez użytkownika.

0

WayneAKing opublikował an alternative w Microsoft Developer Center.

Powołując go:

Przejdź tutaj

http://cpp.snippets.org/code/

i pobrać ten plik

Stptok.C Lepsza tokenizing funkcja

Można również pobrać potrzebne pliki nagłówkowe z tej samej witryny.

Jest to zmodyfikowana wersja strtok , która umieszcza analizowane tokeny (ciągi) w osobnym buforze. Ty powinien być w stanie zmodyfikować go do dostosować swoje potrzeby.

  • Wayne

PS: - Zwróć uwagę, że pliki te mogą mieć format * nix w odniesieniu do końca wiersza. to znaczy - 0x0A i nie 0x0D 0x0A

Jest to alternatywa, jeśli nie masz biblioteki Microsoft w swoim środowisku.

Nadzieję, że pomaga innym:)