strtok之间的函数调用?
Function calls between strtok?
所以我使用 strtok
将 char 数组拆分为 " "
。然后我将拆分的每个单词放入一个函数中,该函数将根据列表确定单词的值。但是,我将函数调用放在 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
循环就会在第一个单词后中断。
strtok()
使用隐藏状态变量来跟踪源字符串位置。如果你在get_score()
中直接或间接再次使用strtok
,这个隐藏状态将被改变,使调用p = strtok(NULL, " ");
变得毫无意义。
不要以这种方式使用 strtok()
,要么使用在许多系统上可用的改进版本 strtok_r
standardized in POSIX。或者 re-implement 它与 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 != '[=10=]') {
/* we have a token */
token = s;
/* skip the token */
s += strcspn(s, delim);
if (*s != '[=10=]') {
/* cut the string to terminate the token */
*s++ = '[=10=]';
}
}
*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);
}
所以我使用 strtok
将 char 数组拆分为 " "
。然后我将拆分的每个单词放入一个函数中,该函数将根据列表确定单词的值。但是,我将函数调用放在 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
循环就会在第一个单词后中断。
strtok()
使用隐藏状态变量来跟踪源字符串位置。如果你在get_score()
中直接或间接再次使用strtok
,这个隐藏状态将被改变,使调用p = strtok(NULL, " ");
变得毫无意义。
不要以这种方式使用 strtok()
,要么使用在许多系统上可用的改进版本 strtok_r
standardized in POSIX。或者 re-implement 它与 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 != '[=10=]') {
/* we have a token */
token = s;
/* skip the token */
s += strcspn(s, delim);
if (*s != '[=10=]') {
/* cut the string to terminate the token */
*s++ = '[=10=]';
}
}
*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);
}