解析C中的空格分隔文本

ryb*_*ome 3 c command-line

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

Please enter a command:

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

ls
Run Code Online (Sandbox Code Playgroud)

要么

ls -l
Run Code Online (Sandbox Code Playgroud)

但麻烦的是,似乎没有简单的方法来做到这一点.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++;
}
Run Code Online (Sandbox Code Playgroud)

...然后user_input[0]会得到"ls",然后循环将重新开始,然后user_input[0]将获得"-l".

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

谢谢!

Cas*_*bel 7

如果您的用例很简单,可以使用strtok执行此操作:

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
Run Code Online (Sandbox Code Playgroud)

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

您可以使用strtokstrtok_r在空格上拆分字符串.

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

kilanash有助于让我想起我明显的遗漏 - GNU getopt.但是,您仍然必须首先自己解析为单独的参数.