我的任务是创建一个嵌套的Unix shell,它使用fork/exec/wait模型执行命令。其中一条指令指出,如果命令不存在(如"cd“),则需要打印所尝试的命令。例如(如果输入是cd,则输出为"cd:未找到命令“。)
但我无论如何也想不出如何打印输入的命令。
我声明了一个数组,尝试使用scanf,尝试从char **转换为char *,或者int;我暴力强制它的所有尝试都不起作用。
代码如下:
int main() {
char **command;
char *input;
pid_t child_pid;
int stat_loc;
char arg[20];
while (1)
{
input = readline("minor2> ");
command = get_input(input);
if(!command[0])
{
free(input);
free(command);
continue;
}
else if(command[0]=="quit")
{
exit(1);
}
child_pid = fork();
if (child_pid == 0)
{
/*Never returns if call is a success*/
execvp(command[0], command);
printf("%s", arg);
printf(": command not found.\n");
}
else
{
waitpid(child_pid, &stat_loc, WUNTRACED);
}
free(input);
free(command);
}
char **get_input(char *input) {
char **command = malloc(8 * sizeof(char *));
char *separator = " ";
char *parsed;
int index = 0;
parsed = strtok(input, separator);
while (parsed != NULL) {
command[index] = parsed;
index++;
parsed = strtok(NULL, separator);
}
command[index] = NULL;
return command;
}我收到的一些错误:"assignment makes from pointer wint a cast -wint-conversion“
“强制转换为不同大小的整数指针”
"1value需要作为赋值的左操作数“
我只是有点迷惑。我相信有一个优雅的解决方案,我只是没有足够的经验来解决它。
发布于 2019-10-08 04:05:27
首先,您试图打印arg作为命令名,但是我真的看不到您将任何内容分配给arg的位置,因此打印可能会由于无效的内存访问而随时中断(除非您在堆栈附近遇到解释为空终止符的0 )。您可以简单地替换
printf("%s", arg);使用
printf("%s", command[0]);它应该做到这一点。
否则,您应该注意填充arg字符数组来保存命令名。
我将编辑我的答案,因为我还可以看到另一个问题:
在C中,char *是指向内存位置的指针,因此从技术上讲,它只是一个整数。如果你试着这样比较:
if (command[0]=="quit")检查几乎总是失败(在您的代码流中,它总是失败)。这是因为您比较两个不同的内存地址,而您应该比较内存位置的内容。在C中比较两个字符串的正确方法是一个字符一个字符地比较,直到到达空终止符。有一个函数可以做到这一点:
strcmp(command[0], "quit");如果字符串相等,则返回0,否则返回不同于0的值。
https://stackoverflow.com/questions/58276156
复制相似问题