0

我发现了类似的帖子,但我的问题没有明确的答案strtok_r

strtok_r用来解析命令行以获取我需要通过带有标志的 execv 执行的命令,但是,出于测试目的,我打印出来。尝试分隔多个字符(不包括空格)时,它可以正常工作。但是在测试空格时,使用下面的代码:

void tokenize(char *str1)
{
  char *token;
  char *saveptr1;
  int j, i;


  const char *delim = " ";
  i = strlen(str1);

  for(j = 0; j < i; j++, str1 = NULL)
  {
    token = strtok_r(str1, delim, &saveptr1);
    if(token == NULL)
      break;

    printf("save: %s\n", token);
    printf("\n");
  }
}

我得到以下测试字符串 ( ls -al) 的输出:

save: ls
4

2 回答 2

1

你怎么读字符串?也许您正在阅读类似以下内容的字符串: cin >> string; 或 scanf("%s", str); 只读取第一个令牌(“ls”)。

相反,您应该使用 cin.getline() 或 scanf("%[^\n]", str) 之类的内容阅读整行。检查那个!

为什么 strtok_r 而不是 strtok?

于 2011-09-20T03:59:38.453 回答
0

您的 for 循环str1=NULL在每次通过循环后设置

for(j = 0; j < i; j++, str1 = NULL)
{
    ...
}

所以第一次通过循环时,它会按预期工作,但在那之后,不再提取任何标记,因为str1不再指向字符串。

于 2011-09-20T05:31:12.967 回答