#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 上进行测试