我正在编写一个充当简单shell的程序。用户从命令行调用该程序,并提示输入发送到OS以完成的命令。它应该运行直到用户输入“完成”,此时程序应该中断。我遇到了输入完成的问题 - 程序应该退出,但打印
sh: -c: line 0: syntax error near unexpected token `done'
sh: -c: line 0: `done'
在完成执行之前到终端。这是我编写的适用的代码:
char isDone[] = "done\n"; //fgets stores the new line character from the command line
do {
printf(">>"); //print the prompt each time through the loop
fgets(command, 50, stdin); //get a line from the terminal
system(command);
} while (strcmp(command, isDone) != 0); //break the loop if the user types in done
我认为错误与“完成”不是有效的UNIX命令有关,但我不知道如何处理这个错误。我尝试使用以下修复解决此问题:
if(system(command) == -1){
printf("The OS doesn't recognize this command");
}
else
system(command);
但这并没有解决问题或将错误打印到屏幕上,并且创建了第二个打印命令/错误的问题 - 一次在if条件块中,一次在else块中。我该如何解决这个问题?
修改 的 这是一个需要使用do-while的家庭作业问题。有没有使用do-while的解决方案?
答案 0 :(得分:2)
{<1}}构造在检查循环条件之前执行其主体。因此,当循环“实现”用户输入do...while
时,它已经尝试将该输入作为循环体内的命令执行。
解决此问题的最明确方法是使用done
:
break
以这种方式构造它的原因是每次迭代都包含应该在条件(读取用户输入)之前执行的操作和应该在条件之后执行的操作(使用{{1}执行命令时执行的操作})。因此,while (1)
{
fgets(command, 50, stdin);
if (!strcmp(command, isDone)) break;
system(command);
}
或简单system()
都不允许您直观地构建代码。 do...while
关键字为您提供了一种将循环终止条件置于循环体中间的方法。
答案 1 :(得分:0)
执行顺序是:
fgets(command, 50, stdin); //get a line from the terminal
system(command);
strcmp(command, isDone) != 0
所以&#34;完成&#34;被读取,发送到系统(尝试将其作为shell命令执行,打印错误),然后才检查它。
你可以尝试这样的事情:
for(;;){
printf(">>"); //print the prompt each time through the loop
fgets(command, 50, stdin); //get a line from the terminal
if(!strcmp(command, isDone)) break; //break the loop
system(command);
}
编辑:如果你想保留do-while:
printf(">>"); //print the prompt each time through the loop
fgets(command, 50, stdin); //get a line from the terminal
do {
system(command);
printf(">>"); //print the prompt each time through the loop
fgets(command, 50, stdin); //get a line from the terminal
} while (strcmp(command, isDone) != 0); //break the loop if the user types in done
但break
版本显然更具可读性。
答案 2 :(得分:0)
在fgets()之后,在if语句中执行system()调用:
if ( strcmp( isDone, command) != 0 ) {
system( command );
}