因此,我正在使用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
循环就会在第一个单词之后中断。
答案 0 :(得分:7)
strtok()
使用隐藏状态变量来跟踪源字符串位置。如果再次在strtok
中直接或间接使用get_score()
,则此隐藏状态将更改,以使调用p = strtok(NULL, " ");
变得毫无意义。
请勿以这种方式使用strtok()
,请使用许多系统上可用的改进版本strtok_r
standardized in 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);
}