strtok 内部的 strtok 无法使用原始令牌的副本 - C
Strtok inside strtok not working with copy of original token - C
我意识到标题令人困惑,想不出更清晰的措辞方式。基本上,我在 strtok 循环内调用 strtok 循环,但是当来自 runCommand 的内部 strtok 函数 returns 时,我的第一个 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
不知道它执行的上下文,它的行为有点全局。
尝试使用 strtok_r
,它允许您指定上下文,以便多个单独的使用不会相互干扰。
来自man page:
Different strings may be parsed concurrently using sequences of calls to strtok_r()
that specify different saveptr
arguments.
函数strtok
不可重入。它会记住它的当前状态,这就是为什么你通过 NULL
重复调用而没有段错误。
考虑使用允许调用者保存状态的 strtok_s
或 strtok_r
(取决于实现)。这些可以以嵌套方式使用。
我意识到标题令人困惑,想不出更清晰的措辞方式。基本上,我在 strtok 循环内调用 strtok 循环,但是当来自 runCommand 的内部 strtok 函数 returns 时,我的第一个 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
不知道它执行的上下文,它的行为有点全局。
尝试使用 strtok_r
,它允许您指定上下文,以便多个单独的使用不会相互干扰。
来自man page:
Different strings may be parsed concurrently using sequences of calls to
strtok_r()
that specify differentsaveptr
arguments.
函数strtok
不可重入。它会记住它的当前状态,这就是为什么你通过 NULL
重复调用而没有段错误。
考虑使用允许调用者保存状态的 strtok_s
或 strtok_r
(取决于实现)。这些可以以嵌套方式使用。