strtok()在应该存在令牌时返回NULL

时间:2016-09-17 21:32:11

标签: c arrays strtok

我正在使用基本shell并使用strtok将一行分解为命令,然后将命令分解为参数。但是,我遇到了令牌器不会返回所有令牌的问题。

例如,我输入字符串ls -l; cat "foo.txt。标记生成器应返回命令ls -lcat "foo.txt"。然后应该将命令分解为参数ls-lcat"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填充数组并且我按照解决方案指示进行操作时,我不确定我做错了什么。

1 个答案:

答案 0 :(得分:2)

问题

strtok修改您标记的字符串,用0替换它找到的分隔符。结果是存储在原始数组中的字符串中存储了许多字符串。

解决方案1:不要修改数组

strchr会找到第一个出现的字符,我们可以用它来计算令牌的数量。 只是不要增加下一个字符为分隔符的循环的计数。然后,当你想迭代实际的标记时,你可以再次使用它(或strtok)。

如果要允许多个分隔符选项,也可以使用strpbrk

解决方案2:遍历数组中嵌入的字符串

"Token:"处开始command[i]循环,然后逐步转到strtok(arglist + strlen(arglist) + 1, " ")

否则

这是C,当然还有其他解决方案。