C 从字符串获取令牌(stdin)

C 从字符串获取令牌(stdin),c,token,tokenize,strtok,C,Token,Tokenize,Strtok,我必须制作自己版本的bash,但我目前一直在获取代币 这个程序的目的是用户插入命令并由程序执行(如bash)。命令从标准输入(当按下回车键时,执行) 当我想分离命令和参数时,我遇到了一个问题,例如,echo lol我想要一个数组(指针或更好的?),它将存储命令echo和参数lol 我试过这样做,但我不确定自己是否走上了正确的道路。有什么建设性的建议吗 char *tokens; char *arg[10]; char command[100]; int token_counter; while

我必须制作自己版本的bash,但我目前一直在获取代币

这个程序的目的是用户插入命令并由程序执行(如bash)。命令从标准输入(当按下回车键时,执行)

当我想分离命令和参数时,我遇到了一个问题,例如,
echo lol
我想要一个数组(指针或更好的?),它将存储命令
echo
和参数
lol

我试过这样做,但我不确定自己是否走上了正确的道路。有什么建设性的建议吗

char *tokens;
char *arg[10];
char command[100];
int token_counter;

while(scanf("%50[^\n]", line) != EOF){ 

    tokens = strtok(line, " ");
    command = tokens;
    token_counter = 0;
    while(tokens = strtok(NULL, " ")){
          arg[token_counter] = tokens
              token_counter++;
    }

        switch(command){

            command1 :
              //code
              break;

            command2 :
              //code
              break;

            ...

        }

}

我认为您可以使用链表进行解析:对于简单的命令,array可能还可以,但是如果您想要实现一个真正的shell,这将很困难


LL解析器可能会让您感兴趣:

也许您想将while更改为:while(tokens==strtok(NULL,”)使用相等运算符,solo“=”是赋值运算符。代码看起来很好。@crafter赋值很好。
while
将检查LHS上的值是否为null。@user2202368
command=tokens
不起作用,
command
是一个数组。而且您没有声明
line
。虽然是空的,但总体思路是可以的你应该通读整行,而不是在50处删掉(即使你放弃了结尾)@MattMcNabb我该如何更改它以便它读取整行?保留50?我该如何存储命令的名称?我不能使用指针,因为当
标记
更改
命令
更改时,您可以读取50,然后丢弃字符,直到下一个换行。或者您可以动态分配mem您应该将这些字符存储在一个数组中。
strtok
函数将指针返回到同一个数组中;如果这不合适,那么您必须复制所有字符。