c - strtok 内部的 strtok 无法使用原始 token 的副本 - C

标签 c copy token strtok

<分区>

我意识到标题令人困惑,想不出更清晰的措辞方式。基本上,我在 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 搞砸了我的第一个函数的解析吗?我真的不明白为什么它不能使用我的原始 token 的副本。可能很简单,但我已经看了太久了?

最佳答案

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

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

关于c - strtok 内部的 strtok 无法使用原始 token 的副本 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41623405/

相关文章:

c++ - Const 类成员复制构造函数

android - Android 的 token 模式

c - 电话簿链接列表

c - 链表循环迭代改变全局变量头

c++ - 如何优雅地将字符串从 ifstream 复制到 vector<string>?

使用 clone_from_slice() 而不是 copy_from_slice() 的性能损失?

c# - IdentityServer4 如何创建身份 token ?

WCF 通过 net.tcp 使用 token 身份验证,丢失 TokenHandler 和 AuthorizationManager 之间的声明

python - 编写扩展时如何在 Python 和 C 之间传递空指针?

c - 如果不同的数据类型作为参数,运算符的结果是什么? (C)