Strtok似乎没有修改输入字符串
strtok does not appear to modify the input string
我一直理解,应谨慎考虑strtok
,因为它通过在最后一个令牌位置插入nulls来修改其输入字符串。这也通过cppreference验证。
但是,在尝试从cplusplus.com验证一个示例时,我发现在32位Windows 7中的VS2010中,Strtok实际上并未在原始字符串中插入nulls。我能够通过将参数中的null从示例到str中的null进行修改,并且程序反复循环,将"此"作为令牌(如我所解释的)与传递前一个的行为不相同指针,如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 ("%sn",pch);
pch = strtok (str, " ,.-");
printf("%sn", 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
编辑:解决了我应该删除此垃圾还是让它留下来?哈哈,我不想从必须处理这个
我能够通过从示例到str的参数中修改参数中的null来确定这一点,然后程序循环
之所以这样做,是因为当您传递str
(或非挂钩指针)时,strtok()
重新开始,因此它将仅将单个令牌化(一遍又一遍地返回)。这是将非挂钩指针传递给strtok()
的记录行为。
当您将NULL
作为第一个参数传递给strtok()
时,它告诉它上次拿起它的位置(它将该状态跟踪在某个地方的静态变量中,这是strtok()
的问题之一)。/p>
首先,插入原始字符串的不是 NULL
,而是插入的零字符。虽然我知道这可能是您想说的,但要参与一个知名且完全无关的宏NULL
。
其次,如果strtok
未能将零字符插入原始字符串,则根本无法按预期工作。因此,我坚信您以某种方式误解了实验的结果。strtok
甚至在32位Windows 7下的VS2010中修改了输入字符串。
您发布的代码中的输出清楚地表明字符串已修改。str
的原始值为"- This, a sample string."
。从循环内部打印的str
的值只是"- This"
。该字符串被截断了,因为strtok
在"- This"
之后插入了一个零字符(更确切地说,,
字符get get 用