我正在编写一个简单的命令行解释器。我的代码使用scanf读取一个字符串,并使用下面显示的getArgs()函数对其进行解析,然后将该数组用作execvp的参数来执行诸如ls之类的命令。如果我仅调用“ ls”,则它起作用,但是当我调用“ ls -la”时,其结果与“ ls”相同。
void getArgs(char* command, char* args[]){
int i = 0;
char* p = strtok(command, " ");
args[i] = p;
while(p != NULL){
i++;
p = strtok(NULL, " ");
args[i] = p;
}
}
这是我的主要功能,其中包括给定参数的初始化:
int main(){
char *args[1024];
char example[30];
char exit[5] = {'q', 'u', 'i', 't', '\0'};
int f1;
int status;
size_t n = sizeof(args)/sizeof(args[0]);
while(strncmp(example, exit, 30) !=0){
printf(">>>");
scanf("%s", example);
getArgs(example, args);
int x = strncmp(args[0], exit, 30);
if (x != 0){
f1 = fork();
if (f1 != 0){
/* wait for child process to terminate */
waitpid(f1, &status, 0);
}
else{myExec(args);}}
else{
return 0;}}
return 0;
}
我对该问题的猜测是我的参数数组args不是以null结尾的,因此当我尝试在myExec()中使用它时:
void myExec(char* args[]){
execvp(args[0], args);
}
这不起作用。所以我的问题是,我可以将数组的最后一个非空部分之后的项目设置为null来尝试使其工作吗?如果是这样,我该怎么做?有解决这个问题的更好方法吗?
答案 0 :(得分:1)
-la
被忽略,因为scanf("%s", example);
将在第一个空格处停止。我建议
scanf(" %29[^\n]", example);
哪个
还要注意,在while(strncmp(example, exit, 30) !=0)
的第一次执行中,example
是一个未初始化的变量,因此需要将其设为
char example[30] = "";
答案 1 :(得分:1)
%s
指令在第一个空格字符处停止扫描,因此它无法正确捕获带有空格的任何命令(例如ls -la
)。如果要保留任何空格,应使用fgets
来获取用户输入:
if ( fgets( example, sizeof example, stdin ) )
{
getArgs( example, args);
...
}
fgets
将最多sizeof example - 1
个字符读入example
(包括换行符!)中,并以0终止该字符串。您可能需要在您的strtok
呼叫中考虑换行符。