Вызов функции между стрток? - PullRequest
2 голосов
/ 07 мая 2019

Поэтому я использую strtok, чтобы разделить массив символов на " ". Затем я помещаю каждое слово, которое я разделил, в функцию, которая будет определять значение слова на основе списка. Однако все, что я помещаю вызов функции в середине цикла while для разделения массива char, останавливается.

Должен ли я разделить массив, сохранить его в другом массиве и затем пройти второй массив?

    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 Ответ

7 голосов
/ 07 мая 2019

strtok() использует скрытую переменную состояния, чтобы отслеживать положение исходной строки. Если вы снова используете strtok, прямо или косвенно в get_score(), это скрытое состояние будет изменено, чтобы сделать вызов p = strtok(NULL, " "); бессмысленным.

Не используйте strtok() таким образом, либо используйте улучшенную версию strtok_r , стандартизированную в POSIX , доступную во многих системах. Или повторно внедрите его с помощью strspn и strcspn:

#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);
    }
...