strtok不会返回nullptr

时间:2018-02-05 13:12:14

标签: c++ strtok

功能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中编译了这个并且总是一样:/

请告诉我我做错了什么。

2 个答案:

答案 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,因为第一个“标记”跨越整个字符串。