【问题标题】:Getting tokens from a string(stdin)从字符串中获取标记(stdin)
【发布时间】:2014-05-27 20:16:40
【问题描述】:

我必须制作自己的 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;

            ...

        }

}

【问题讨论】:

  • 也许你想把你的while改成这样:while(tokens == strtok(NULL, " ") 使用相等运算符,单独的'='是赋值运算符。
  • 代码看起来没问题。 @TheCrafter 任务很好。 while 将检查 LHS 上的值是否为空。
  • @user2202368 command = tokens 不起作用,command 是一个数组。而且你没有声明line。总体思路是可以的,尽管您应该阅读整行而不是在 50 处截断(即使您丢弃结尾)
  • @MattMcNabb 我将如何更改它以便读取整行?离开50?那我将如何存储命令的名称?我不能使用指针,因为当tokens 更改时command 更改
  • 您可以读取 50 个字符,然后丢弃直到并包括下一个换行符的字符。或者您可以随时动态分配内存。您应该将这些字符存储在一个数组中。 strtok 函数返回指向同一个数组的指针;如果这不合适,那么您将不得不复制所有内容。

标签: c token tokenize strtok


【解决方案1】:

我认为你可以使用链表来解析:对于简单的命令,数组可能没问题,但如果你想做一个真正的shell,那就很难了。

LL 解析器对你来说可能很有趣:http://en.wikipedia.org/wiki/LL_parser

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 2011-05-30
    • 2020-08-20
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多