我正在为一个应该以非常基本的形式模拟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".
gets并fgets采取整行.显然,这个问题可以通过浏览和挑选出每个单独的论点来逻辑地解决......但是如果有一种我想念的简单方法,我希望避免这样做.在那儿?
谢谢!
如果您的用例很简单,可以使用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.
您可以使用strtok或strtok_r在空格上拆分字符串.
如果你正在做一些更复杂的事情,其中一些参数可能有(引用)空格,你自己很难解决它 - 尽管你可以看一下shell的来源(例如bash)到看看它是如何处理它的.
kilanash有助于让我想起我明显的遗漏 - GNU getopt.但是,您仍然必须首先自己解析为单独的参数.
| 归档时间: |
|
| 查看次数: |
2587 次 |
| 最近记录: |