代码之家  ›  专栏  ›  技术社区  ›  rybosome

在C中解析空格分隔的文本

  •  3
  • rybosome  · 技术社区  · 15 年前

    我正在为一个学校项目编写一个程序,这个项目应该以非常基本的形式模拟unix shell。它基本上是解析输入,然后执行fork/exec。我需要能够单独读取程序中的参数(而不是作为从命令行传递给程序的参数)。例如,我会提示:

    Please enter a command:
    

    …我需要能够分析这两个…

    ls
    

    ls -l
    

    但问题是,要做到这一点似乎不容易。 scanf() 将逐个提取每个参数,但我看不到将它们放入char*数组中不同的槽中的方法。例如,如果我这样做…

    char * user_input[10];
    for (int i=0; i<10; i++){
        user_input[i] = (char *) malloc(100*sizeof(char));
    }
    
    for (int i=0; *(user_input[i]) != '@'; i++)
    {
        scanf("%s", user_input[index]);
        index++;
    }
    

    然后…… user_input[0] 将得到 "ls" ,然后循环将重新开始,然后 用户输入(0) 将得到 "-l" .

    gets fgets 全力以赴。显然,这个问题可以从逻辑上解决,通过仔细研究并找出每一个独立的论点……但如果有一个简单的方法我想避免这样做,如果我错过了。有?

    谢谢!

    4 回复  |  直到 15 年前
        1
  •  7
  •   Cascabel    15 年前

    如果你的用例足够简单,你可以用 strtok :

    char *strtok(char *str, const char *delim);
    char *strtok_r(char *str, const char *delim, char **saveptr);
    

    这个 strtok() 函数将字符串解析为一系列标记。第一次呼叫 Sttok() 应在中指定要分析的字符串 str . 在每一个应该解析相同字符串的后续调用中, STR 应该是 NULL .

    你可以使用 strtok strtok_r 在空格上拆分字符串。

    如果您正在做一些更复杂的事情,其中一些参数中可能有(引用的)空格,那么您会很难自己解析它——尽管您可以查看shell的源代码(例如bash)来了解它如何处理它。

    基拉纳什让我想起了我明显的疏忽。- GNU getopt . 不过,您仍然需要先自己解析成单独的参数。

        2
  •  2
  •   msw    15 年前

    忘了 scanf 因为它很少做你想要的。一次获取整行,然后编写代码将其拆分。 strtok -对这个问题的第二个最受欢迎的答案也是问题重重。

        3
  •  1
  •   Logan Capaldo    15 年前

    你可以使用 strtok_r 在空白处分解字符串。注意,这是一个破坏性的操作(修改输入字符串)。

        4
  •  1
  •   Tiho    15 年前

    试着看看这些是否有助于你:

    ANSI C Command Line Option Parsing Library

    The Argtable Homepage

    当做, 蒂霍