strtok之间的函数调用?

时间:2019-05-07 07:58:49

标签: c strtok

因此,我正在使用strtok" "拆分一个char数组。然后,将拆分的每个单词放入一个函数,该函数将基于列表确定单词的值。但是,我将函数调用放在将char数组拆分的while循环中间的所有操作都会停止。

我是否必须拆分数组,将其存储在另一个数组中,然后遍历第二个数组?

    p = strtok(temp, " ");

    while (p != NULL) {
        value =  get_score(score, scoresize, p);
        points = points + value;
        p = strtok(NULL, " ");
    }

只要有value = get_score(score, scoresize, p);while循环就会在第一个单词之后中断。

1 个答案:

答案 0 :(得分:7)

strtok()使用隐藏状态变量来跟踪源字符串位置。如果再次在strtok中直接或间接使用get_score(),则此隐藏状态将更改,以使调用p = strtok(NULL, " ");变得毫无意义。

请勿以这种方式使用strtok(),请使用许多系统上可用的改进版本strtok_r standardized in POSIX。或使用strspnstrcspn重新实现它:

#include <string.h>
char *my_strtok_r(char *s, char *delim, char **context) {
    char *token = NULL;

    if (s == NULL)
        s = *context;

    /* skip initial delimiters */
    s += strspn(s, delim);
    if (*s != '\0') {
        /* we have a token */
        token = s;
        /* skip the token */
        s += strcspn(s, delim);
        if (*s != '\0') {
            /* cut the string to terminate the token */
            *s++ = '\0';
        }
    }
    *context = s;
    return token;
}

...

    char *state;
    p = my_strtok_r(temp, " ", &state);

    while (p != NULL) {
        value =  get_score(score, scoresize, p);
        points = points + value;
        p = my_strtok_r(NULL, " ", &state);
    }