解析C中的空格分隔文本

时间:2010-08-19 13:30:13

标签: c command-line

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

Please enter a command:

...我需要能够解析两个......

ls

OR

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",然后循环将重新开始,然后user_input[0]将获得"-l"

getsfgets只需要整行。显然,这个问题可以通过浏览和挑选出每个单独的论点来逻辑地解决......但是如果有一种我想念的简单方法,我希望避免这样做。有吗?

谢谢!

4 个答案:

答案 0 :(得分:7)

如果您的用例足够简单,可以使用strtok

执行此操作
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
  

strtok()函数将字符串解析为一系列标记。在第一次调用strtok()时,应在str中指定要解析的字符串。在应解析相同字符串的每个后续调用中,str应为NULL

您可以使用strtokstrtok_r将字符串拆分为空格。

如果你正在做一些更复杂的事情,其中​​一些参数可能有(引用)空格,你自己很难解析它 - 尽管你可以看一下shell的来源(例如bash)看看它是如何处理它的。

kilanash帮助我提醒我明显遗漏 - GNU getopt。不过,你仍然必须先自己解析成单独的参数。

答案 1 :(得分:2)

忘记scanf存在,因为它很少能满足您的需求。立即获取整行,然后编写代码将其拆分。 strtok - 这个问题的第二个最受欢迎的答案 - 也是问题所在。

答案 2 :(得分:1)

您可以使用strtok_r在空白处打破字符串。请注意,它是一种破坏性操作(修改输入字符串)。

答案 3 :(得分:1)

尝试查看这些内容是否对您有所帮助:

ANSI C Command Line Option Parsing Library

The Argtable Homepage

此致 Tiho