【问题标题】:strtok_r tokens with delimiters带分隔符的 strtok_r 标记
【发布时间】:2011-09-20 03:45:12
【问题描述】:

我发现了类似的帖子,但我对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

【问题讨论】:

    标签: c strtok


    【解决方案1】:

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

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

    为什么用 strtok_r 代替 strtok?

    【讨论】:

    • 我使用scanf从命令行读入,但我不明白你写的scanf是做什么的。另外,strtok_r 因为我必须跟踪影响进程创建和顺序的其他命令
    • 如果您的输入是:“ls -al”并使用 scanf("%s", str),则 scanf 只读取“ls”。 scanf("%[^\n]\n", str) = 读取整行,在未到达行尾时读取 (^\n),也许您更喜欢使用读取一行而不仅仅是字符串的 gets()。
    • 我现在使用您建议的 scanf 得到了正确的完整行,但是,我一直在等待输入另一行条目,然后程序执行并打印。你认为运行gets循环会更好吗?
    • 尝试使用 scanf("%[^\n]", str): 删除最后一个 '\n'。关于使用 gets() 存在一个有争议的问题,实际上不建议使用。
    • 那是问题所在,不需要额外的\n字符,非常感谢您的帮助
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2017-09-21
      相关资源
      最近更新 更多