2013-04-12 15 views
28

Jak mogę użyć strtok_r zamiast strtok aby to zrobić?C: prawidłowe użycie strtok_r

char *pchE = strtok(NULL, " "); 

Teraz staram się używać strtok_r właściwie ... Ale czasami mam problemy z strtol. Mam wątek, który wykonuję 10 razy (w tym samym czasie).

char *savedEndd1; 
char *nomeClass = strtok_r(lineClasses, " ", &savedEndd1); 
char *readLessonS = strtok_r (NULL, " ", &savedEndd1); 
char *readNTurma = strtok_r(NULL, " ", &savedEndd1); 

if (readNTurma==NULL) 
printf("CLASS STRTOL begin %s %s\n",nomeClass, readLessonS); 
int numberNTurma = strtol(readNTurma, NULL, 10); 

A ja łapania że readNTurma == NULL kilkakrotnie ... Dlaczego tak jest? Nie rozumiem, dlaczego przychodzi NULL?

+0

zobacz ten http://stackoverflow.com/questions/2227198/segmentation-fault-when-using-strtok-r –

Odpowiedz

32

documentation dla strtok_r jest całkiem jasne.

Funkcja strtok_r() jest wersją retrantu strtok(). Argument saveptr jest wskaźnikiem do zmiennej char *, która jest używana wewnętrznie przez strtok_r() w celu utrzymania kontekstu między kolejnymi wywołaniami, które parsują ten sam ciąg.

Przy pierwszym wywołaniu strtok_r(), str powinien wskazywać na ciąg do analizy, a wartość saveptr jest ignorowana. W kolejnych połączeniach, str powinien mieć wartość NULL, a saveptr powinno pozostać niezmienione od poprzedniego połączenia.

Więc chcesz mieć kod jak

char str[] = "Hello world"; 
char *saveptr; 
char *foo, *bar; 

foo = strtok_r(str, " ", &saveptr); 
bar = strtok_r(NULL, " ", &saveptr); 
+0

co ze sttolem? Czy wątek jest bezpieczny, czy istnieje sposób na konwersję char do int wątku bezpiecznie? – Carlcox89

+6

Nie mogę sobie wyobrazić, dlaczego 'strtol' nie byłby bezpieczny dla wątków. – tangrs

1
char str[]="string for sample"; 
char *reserve; 
char *pchE = strtok_r(str, " ", &reserve);//when next call str -> NULL 
8

My badanego przykładu. (TEST this code)

#include <stdio.h> 
#include <string.h> 

char str[] = "1,22,333,4444,55555";  
char *token; 
char *rest = str; 

while((token = strtok_r(rest, ",", &rest))) 
{ 
    printf("token:%s\n", token); 
} 

Wynik.

token:1 
token:22 
token:333 
token:4444 
token:55555 

może to nie jest idealne, ale to działa z minimy zmiennych i strtok_r jest bezpieczne dla wątków.

Powiązane problemy