C:使用system()命令

时间:2014-03-10 19:14:24

标签: c error-handling system

我正在编写一个充当简单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的解决方案?

3 个答案:

答案 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 );
}