我一直都明白strtok
应该谨慎对待,因为它通过在最后一个令牌位置插入NULL来修改其输入字符串。这也由cppreference验证。
但是,在尝试从cplusplus.com验证example时,我发现在32位Windows 7的VS2010中,strtok实际上并未在原始字符串中插入NULL。我能够通过将参数中的NULL从示例修改为str来确定这一点,并且程序重复循环,将“This”作为标记传递,(正如我解释的那样),与传递之前的行为不同指针,正如cppreference声称的那样。
另外,我想也许字符串文字的常量可能有问题,所以我复制了字符串
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
编辑:已解决我应该删除这些垃圾还是让它留下来?哈哈,我不想从那些不得不处理这个问题的穷人那里拿走积分
答案 0 :(得分:4)
我能够通过将参数中的NULL从示例修改为str来确定这一点,并且程序重复循环
这样做是因为当你传入str
(或非空指针)时,strtok()
重新开始,所以它只会标记现在的单个标记(一遍又一遍地返回) 。当非NULL指针传递给strtok()
时,这是记录的行为。
当你将NULL
作为strtok()
的第一个参数传递给它时,它告诉它上次从中断的地方(它在一个静态变量中跟踪该状态,这是一个strtok()
)的问题。
答案 1 :(得分:3)
首先,插入原始字符串不是NULL
,它是插入的零字符。虽然我知道这可能就是你想说的,但是让一个众所周知且完全不相关的宏NULL
参与其中仍然不是一个好主意。
其次,如果strtok
未能在原始字符串中插入零个字符,则它将无法按预期工作。出于这个原因,我坚信你以某种方式误解了你的实验结果。即使在32位Windows 7下的VS2010中,strtok
也会修改输入字符串。
您发布的代码的输出清楚地显示字符串已修改。 str
的原始值为"- This, a sample string."
。从循环内部打印的str
的值仅为"- This"
。该字符串被截断,因为strtok
在"- This"
之后插入了一个零字符(更确切地说,,
字符已被替换并带有\0
个字符)。