当前位置:  开发笔记 > 编程语言 > 正文

Strtok里面的strtok没有使用原始令牌的副本 - C.

如何解决《Strtok里面的strtok没有使用原始令牌的副本-C.》经验,为你挑选了1个好方法。

我意识到标题令人困惑,想不到更明确的方式来说出来.基本上,我在strtok循环中调用strtok循环,但是当内部strtok函数从runCommand返回时,我的第一个strtok循环停止.它只是退出循环,即使第一个分号后面还有其他参数.当我不调用runCommand()时,它按预期工作,并解析我用分号分隔的所有命令.

此代码的目标是解析由分号分隔的一行命令,然后解析命令和命令参数以便稍后进入execvp.这是我遇到麻烦的唯一部分.这里是:

void parseCommand(char *userLine) 
{
  if(strchr(userLine, ';'))
  {
    // Get first token
    token = strtok(userLine, ";");
    // Loop through all tokens
    while(token != NULL)
    {
      // Make a copy
      char *copy = malloc(strlen(token) + 1);
      strcpy(copy, token);
      runCommand(copy);
      free(copy);
      printf("process returned!\n");
      token = strtok(NULL, ";");
    }
  }
}
void runCommand(char *token)
{
  char *args[20]; 
  char **command = args;
  //Tokenize each command based on space

  char *temp = strtok(token, " \n");
  while (temp != NULL)
  {
    *command++ = temp;
    temp = strtok(NULL, " \n");
  }
  *command = NULL;
// code for fork and execvp here
}

有人可以解释为什么runCommand搞砸了我的第一个函数的解析?我真的不明白为什么它不能使用原始令牌的副本.可能很简单,但我看了太久了?



1> Weather Vane..:

该功能strtok不可重入.它会记住它的当前状态,这就是为什么你NULL在没有段错误的情况下传递重复调用的原因.

考虑使用strtok_sstrtok_r(取决于实现)允许调用者保存状态.这些可以以嵌套方式使用.

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有