当我从使用
strtok
以逗号分隔的字符串中读取数据时,如果之前读取的值为(空),则正在读取的值会发生移位。
int main (void)
{
char Temp[10] = "1,2,3,,4";
printf("%s\n", strtok(Temp, ","));
printf("%s\n", strtok(NULL, ","));
printf("%s\n", strtok(NULL, ","));
printf("%s\n", strtok(NULL, ","));
printf("%s\n", strtok(NULL, ","));
}
预期输出:
1
2
3
(null)
4
实际输出:
1
2
3
4
(null)
即使有 2 个空格也会发生同样的情况。它只是移动了两次,而不是一次。
当
strtok
解析字符串时,任何连续的分隔符都会被分组在一起。这基本上意味着在到达字符串末尾之前您永远不会看到空白标记。
手册页说明以下内容:
从上面的描述可以看出,两个 or 的序列
考虑解析字符串中更多连续的分隔符字节 是单个分隔符,并且该分隔符字节位于开头或 字符串末尾被忽略。换句话说:代币返回的始终是非空字符串。因此,对于 例如,给定字符串 "aaa;;bbb,",连续调用strtok()
指定分隔符字符串 `;," 将返回字符串 “aaa” 和 “bbb”,然后是一个空指针。strtok()
所以您看到的是预期的行为。
如果您希望能够将连续分隔符视为空白标记,则需要使用
strchr
查找每个分隔符并自行复制相关子字符串。