#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void eat() // clears stdin upto and including \n OR EOF
{
int eat;while ((eat = getchar()) != '\n' && eat != EOF);
}
int main(){
printf("\n COMMAND : "); char cmd[21]=""; scanf("%20s",cmd);
if(strcmp(cmd,"shell")==0||strcmp(cmd,"sh")==0)
{
getchar(); // absorb whitespace char separating 'shell' and the command, say 'ls'
while(1)
{
printf("\n sh >>> "); // print prompt
char shellcmd[1024]=""; // str to store command
scanf("%1023[^\n]",shellcmd); eat(); // take input of command and clear stdin
if(strcmp("close",shellcmd)==0||strcmp("x",shellcmd)==0)
break;
else
system(shellcmd);
}
}
}
在代码中,发生了一些我无法捕捉到的异常行为。
输入sh ls并按[ENTER]后,预期的响应是:
- 1st
scanf()存放sh在.cmd[]_ls\n_stdin getchar()占用空间。printf()打印\n sh >>>到终端- 第二个
scanf()存储ls在shellcmd[],离开\n标准输入 eat()从标准输入读取\n,将其留空system("ls")被执行
即结果应该是这样的:
COMMAND : sh ls
sh >>>
file1 file 2 file3 ...
sh >>> | (cursor)
但
我得到什么:
COMMAND : sh ls
file1 file2 file3 ...
sh >>>
sh >>> |
显然,第二个scanf()和之前shell()正在执行,或者至少这是我的假设。 printf()
有什么问题?
在 Clang 和 GCC 上编译并cc -Wall -Wextra -pedantic在 MacOS 和 Linux 上的 bash 上进行测试