Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中解析空格分隔的文本_C_Command Line - Fatal编程技术网

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

在C语言中解析空格分隔的文本,c,command-line,C,Command Line,我正在为一个学校项目编写一个程序,该项目应该以非常基本的形式模拟Unix shell。它基本上是解析输入,然后执行fork/exec。我需要能够单独读取程序中的参数(不是作为从命令行传递给程序的参数)。例如,我将提示: Please enter a command: 或 但问题是,似乎没有简单的方法可以做到这一点scanf()将分别提取每个参数,但我看不到将它们放入char*数组中不同插槽的方法。例如,如果我这样做 char * user_input[10]; for (int i=0; i&l

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

Please enter a command: 或

但问题是,似乎没有简单的方法可以做到这一点
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++;
}
char*用户输入[10];

对于(int i=0;i您可以使用它在空白处拆分字符串。请注意,这是一种破坏性操作(修改输入字符串)。

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

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

您可以使用
strtok
strtok\u r
拆分空格上的字符串

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


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

忘记
scanf
的存在,因为它很少做你想做的事。立即获取整行代码,然后编写代码将其拆分。
strtok
-这个问题的第二个最受欢迎的答案on-也有很多问题。

试着看看这些是否对您有帮助:

问候,,
Tiho

既然这被标记为家庭作业,那么使用可能会有帮助吗?对于家庭作业出现问题的典型、简单的用例,strtok通常就足够了。不管怎样,说“避免扫描”都会得到+1因为我不认为我见过scanf被很好地使用。足够了,当然。教坏习惯?可能。getopt是这方面相当有名的GNU标准库。@Kilanash:哦,duh。我已经用了十几次了,不知道为什么我没有在我的答案中加入它。当然……getopt在
argv
上工作-shell已经分裂了这个论点当他们到达getopt时,它就启动了。所以这更多的是第二步,在OP询问的初始拆分之后。谢谢。这似乎会起作用…这是一个非常非常基本的shell模拟器,所以我不认为我需要担心引用的空格。我感谢您的帮助!
ls -l
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++;
}
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);