功能strtok不应该像它应该的那样工作。
http://www.cplusplus.com/reference/cstring/strtok/
该网站告诉我,当strtok找不到令牌时,它会返回nullptr。而且我不知道为什么在我的代码中它不会。
以下是示例代码:
int main()
{
char *c = "abcdefg";
if (strtok(c, "^&") != NULL)
printf("I found this in this string");
else
printf("I don;t");
return 0;
}
它始终打印"我在这个字符串中找到了这个"但在字符串" abcdefg"没有像“' ^'或者'&'。
我在Code :: Blocks和Visual Studio中编译了这个并且总是一样:/
请告诉我我做错了什么。
答案 0 :(得分:2)
strtok
函数根据分隔符分解字符串。如果字符串中没有这样的分隔符,则没有任何内容可以分解,因此在第一次调用时返回整个字符串。第二个调用(假设传入相同的分隔符)将返回NULL。第一次调用返回NULL的唯一情况是传入一个空字符串。
手册页说明:
对strtok()的一系列调用,它们对同一个字符串进行操作 维护一个指针,确定从哪个点开始 搜索下一个标记。 第一次调用strtok()设置 这个指针指向字符串的第一个字节。开始 通过向前扫描下一个令牌来确定下一个令牌 str中的nondelimiter字节。如果找到这样的字节,则将其视为 下一个令牌的开始。如果没有找到这样的字节,那么 没有更多的标记,strtok()返回NULL。 (一根绳子 因此,它是空的或仅包含分隔符 strtok()在第一次调用时返回NULL。)
此外,strtok
修改传递给它的字符串以便将其拆分。在您的情况下,c
指向无法修改的字符串文字。您应该将其更改为字符串:
char c[] = "abcdefg";
答案 1 :(得分:0)
第一次调用strtok将永远不会返回NULL,除非传递的字符串为NULL。该函数搜索分隔符字符串中未包含的第一个字符并返回该字符。后续调用将返回NULL tho,因为第一个“标记”跨越整个字符串。