我一直认为strtok
应该谨慎对待,因为它通过在最后一个令牌位置插入 NULL 来修改其输入字符串。这也由cppreference验证。
但是,在尝试验证来自 cplusplus.com 的示例时,我发现在 32 位 Windows 7 中的 VS2010 中,strtok 实际上并未在原始字符串中插入 NULL。我可以通过将示例中的参数中的 NULL 修改为 str 来确定这一点,并且程序重复循环,将“This”作为令牌传递,这(正如我解释的那样)与传递前一个行为不同指针,正如 cppreference 声称的那样。
另外,我想也许字符串文字的 const-ness 可能有问题,所以我复制了字符串
char str2[] ="- This, a sample string.";
char str[50];
strcpy(str,str2);
并再次运行它,但循环重复了。调试器显示输入字符串没有被修改。
有人可以在这里解释我哪里出错了吗?编辑:我认为这是我对“行为与先前存储的指针作为 str 传递的行为相同”的解释。
谢谢你。
编辑:确切的代码:
/* strtok example */
#include <iostream>
#include <stdio.h>
#include <string.h>
int main ()
{
char str2[] ="- This, a sample string.";
char str[50];
strcpy(str,str2);
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (str, " ,.-");
printf("%s\n", str);
}
std::cin.ignore();
return 0;
}
代码输出:
Splitting string "- This, a sample string." into tokens:
This
- This
This
- This
This
- This
This
- This
This
- This
This
- This
This
- This
编辑:已解决我应该删除这个垃圾还是让它留下来?哈哈,我不想从不得不处理这个问题的穷人那里拿分