我正在使用基本shell并使用strtok将一行分解为命令,然后将命令分解为参数。但是,我遇到了令牌器不会返回所有令牌的问题。
例如,我输入字符串ls -l; cat "foo.txt
。标记生成器应返回命令ls -l
和cat "foo.txt"
。然后应该将命令分解为参数ls
,-l
,cat
和"foo.txt"
。但是,我得到以下作为我的输出。
prompt>ls -l; cat "foo"
Command: ls -l
Number of tokens in command: 2
Token : ls
Token : (null)
Number of tokens in command: 0
我的相关代码如下:
char *commands = strtok(line, ";");
int count = 0;
//get # of commands on line
while(commands != NULL){
count++;
//printf("Command : %s\n", commands);
commands = strtok(NULL, ";");
}
commands = strtok(line, ";");
char *command[count];
//build array of commands
for(int i = 0; i < count; i++){
if(commands != NULL){
command[i] = commands;
printf("Command: %s\n", command[i]);
}
commands = strtok(NULL, ";");
}
//Fork Loop
for(int i = 0; i < count; i++){
//printf("Command: %s\n", command[i]);
char *arglist = strtok(command[i], " ");
int arglistc = 0;
//Count number of args in command
while(arglist != NULL){
arglistc++;
arglist = strtok(NULL, " ");
}
printf("Number of tokens in command: %d\n", arglistc);
char *args[arglistc];
arglist = strtok(command[i], " ");
//Build array of args
for(int j = 0; j < arglistc; j++){
args[i] = arglist;
printf("Arglist value : %s\n", arglist);
printf("Token : %s\n", args[i]);
arglist = strtok(NULL, " ");
}
当我查找如何使用strtok填充数组并且我按照解决方案指示进行操作时,我不确定我做错了什么。
答案 0 :(得分:2)
strtok
修改您标记的字符串,用0
替换它找到的分隔符。结果是存储在原始数组中的字符串中存储了许多字符串。
strchr
会找到第一个出现的字符,我们可以用它来计算令牌的数量。 只是不要增加下一个字符为分隔符的循环的计数。然后,当你想迭代实际的标记时,你可以再次使用它(或strtok
)。
如果要允许多个分隔符选项,也可以使用strpbrk
。
在"Token:"
处开始command[i]
循环,然后逐步转到strtok(arglist + strlen(arglist) + 1, " ")
。
这是C,当然还有其他解决方案。