我正在为一个应该以非常基本的形式模拟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"
。
gets
和fgets
只需要整行。显然,这个问题可以通过浏览和挑选出每个单独的论点来逻辑地解决......但是如果有一种我想念的简单方法,我希望避免这样做。有吗?
谢谢!
答案 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
。
您可以使用strtok
或strtok_r
将字符串拆分为空格。
如果你正在做一些更复杂的事情,其中一些参数可能有(引用)空格,你自己很难解析它 - 尽管你可以看一下shell的来源(例如bash)看看它是如何处理它的。
kilanash帮助我提醒我明显遗漏 - GNU getopt。不过,你仍然必须先自己解析成单独的参数。
答案 1 :(得分:2)
忘记scanf
存在,因为它很少能满足您的需求。立即获取整行,然后编写代码将其拆分。 strtok
- 这个问题的第二个最受欢迎的答案 - 也是问题所在。
答案 2 :(得分:1)
您可以使用strtok_r在空白处打破字符串。请注意,它是一种破坏性操作(修改输入字符串)。
答案 3 :(得分:1)