strtok似乎没有修改输入字符串

时间:2012-10-25 19:17:09

标签: c++ c

我一直都明白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

编辑:已解决我应该删除这些垃圾还是让它留下来?哈哈,我不想从那些不得不处理这个问题的穷人那里拿走积分

2 个答案:

答案 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个字符)。