我意识到标题令人困惑,想不到更明确的方式来说出来.基本上,我在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搞砸了我的第一个函数的解析?我真的不明白为什么它不能使用原始令牌的副本.可能很简单,但我看了太久了?
该功能strtok
不可重入.它会记住它的当前状态,这就是为什么你NULL
在没有段错误的情况下传递重复调用的原因.
考虑使用strtok_s
或strtok_r
(取决于实现)允许调用者保存状态.这些可以以嵌套方式使用.