2013-11-15 2 views
-2

strtok() неисправен. Он работает в main(), но не в функции вызова. Пожалуйста, посоветуйте мне. Спасибо.strtok не работает в функции вызова

int checkNumberOfTokens (char* text, char* delimitChar) { 

    int numberOfTokens = 0; 
    char *t; 
    int i; 

    printf("Text: %s\n", text); 
    printf("delimitChar: %s\n", delimitChar); 

    t = strtok(text, delimitChar); 

    for (i=0; t != NULL; i++) { 
     printf("token %d is \"%s\"\n", i, t); 
     t = strtok(NULL, delimitChar); 
     } 

     numberOfTokens = i; 
     printf("Total number of tokens: %d\n", numberOfTokens);  

     return numberOfTokens; 
} 




int main() 

    char* transitionTable[] = { 
           "NA, NA, NA, NA, NA, NA", 
           "defaultStart, elseOther, 1, 2, 6, NA", 

      }; 

      printf("%s \n", transitionTable[1]); 

    char delimitChar[] = ","; 

    checkNumberOfTokens (transitionTable[1], delimitChar); 
+0

, что является причиной для маркировки это вниз? –

ответ

3

strtok входная строка должна быть доступны для записи, как strtok изменяет входную строку. Но вы передаете строковый литерал, и строковые литералы не изменяются.

См с-чаво строковых литералов:

http://c-faq.com/decl/strlitinit.html

+0

Downvoter, не могли бы вы объяснить, почему вы проигнорировали этот ответ? – ouah

2

ПРОБЛЕМА: Вы переходящий в строковый литерал (только для чтения); но strtok() ожидает, что сможет изменить строку.

ПРЕДЛОЖЕНИЕ: попробуйте strchr() вместо strtok().

Пример:

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

int 
checkNumberOfTokens (char * text, char delimitChar) 
{ 
    char *s = text; 
    int ct = 1; 
    if ((s == NULL) || (strlen(s) == 0)) 
    return 0; 

    while ((s = strchr(s, delimitChar))) { 
    s++; 
    ct++; 
    } 
    return ct; 
} 

int main(int argc, char *argv[]) 
{ 
    int ct = checkNumberOfTokens("ABC,DEF,GEHI", ','); 
    printf ("ct=%d\n", ct); 
    return 0; 
} 
+0

Что делать, если мой разделитель изменен на «+ = +»? –

+0

Затем используйте [strstr()] (http://www.cplusplus.com/reference/cstring/strstr/);) – paulsm4

+0

strstr() дает мне остаточный токен, а не целевой. Как мы можем это исправить? –

Смежные вопросы