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

strtok does not appear to modify the input string

本文关键字:修改 输入 字符串 Strtok      更新时间:2023-10-16

我一直理解,应谨慎考虑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 字符替换)。