strtok 不要 return nullptr

strtok don't return nullptr

函数 strtok 无法正常工作。

http://www.cplusplus.com/reference/cstring/strtok/

该网站告诉我们,当 strtok 找不到令牌时,它 returns nullptr。而且我不知道为什么在我的代码中它没有。

示例代码如下:

int main()
{
    char *c = "abcdefg";
    if (strtok(c, "^&") != NULL)
        printf("I found this in this string");
    else
        printf("I don;t");
    return 0;
}

它总是打印 "I found this in this string" 但在字符串 "abcdefg" 中没有像 '^' 或 '&' 这样的字符。

我在 Code::Blocks 和 Visual Studio 中编译了这个并且总是一样的:/

请告诉我我做错了什么。

strtok 函数根据分隔符拆分字符串。如果字符串中没有这样的分隔符,那么就没有什么可以分解的,所以整个字符串在第一次调用时被 returned。第二次调用(假设传入相同的定界符)将 return NULL。第一次调用将 return NULL 的唯一时间是你传入一个空字符串。

手册页指出:

A sequence of calls to strtok() that operate on the same string maintains a pointer that determines the point from which to start searching for the next token. The first call to strtok() sets this pointer to point to the first byte of the string. The start of the next token is determined by scanning forward for the next nondelimiter byte in str. If such a byte is found, it is taken as the start of the next token. If no such byte is found, then there are no more tokens, and strtok() returns NULL. (A string that is empty or that contains only delimiters will thus cause strtok() to return NULL on the first call.)

此外,strtok 修改传递给它的字符串以将其拆分。在您的情况下, c 指向无法修改的字符串文字。您应该将其更改为字符串:

char c[] = "abcdefg";

对 strtok 的第一次调用永远不会 return NULL,除非传递的字符串是 NULL。该函数搜索未包含在定界符字符串中的第一个字符,return 就是你的那个。随后的调用将 return NULL tho,因为第一个 "token" 跨越整个字符串。