作者clarkman (凉雨)
看板C_and_CPP
标题[问题] fgets
时间Sun Feb 8 17:28:11 2009
我想先用scanf 去选择要1.输入指令或是 2.离开
若是选择1,就会呼叫shell()函式
但问题出在shell()函式里面的fgets
电脑会自动跳过,不等待输入
我後来发现问题应该是出在choice() 里的scanf
因为只要我不执行这个函式,我的fgets就能正常使用
但是我在scanf後面加上了fflush(stdin)也没用
一直找不出问题,请问各位前辈有什麽方法解决吗?
如果不用fgets,就不知道要用哪个
gets用在核心会被认定危险,无法编辑
getchar每个字元都要按enter
getche似乎是最好的解答,但是linux没有这个函式
我把scanf改成getc,但是shell里的fgets也是会被自动跳过
谢谢
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char choice(void);
void shell(void);
void child_do(const char cmdstr[]);
int main(void)
{
char cho;
while( ( cho=choice() ) !='2')
{
switch(cho)
{
case '1':
shell();
break;
case '2':
break;
}//end switch
}//end while
return 0;
}
char choice(void)
{
char cho;
printf("%s\n%s\n?"," 1 - Cmd",
" 2 - Exit");
do
{
scanf("%c",&cho); //这里我怀疑有问题
fflush(stdin);
}while((cho!='1') && ( cho!='2'));
return cho;
}
void shell(void)
{
char cmdstr[BUFSIZ]={0};
pid_t pid;
memset(cmdstr,'\0',BUFSIZ);
printf("Enter:");
fgets(cmdstr,BUFSIZ,stdin); //这行会被跳过
if( ( pid=fork() ) < 0)
printf("fork error\n");
else if(pid==0) //child
child_do(cmdstr);
else //parent
wait();
}
void child_do(const char cmdstr[])
{
execlp("sh","sh","-c",cmdstr,0);
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.236.24
※ 编辑: clarkman 来自: 140.115.236.24 (02/08 17:29)
1F:推 williamyu:改成 scanf(" %c",&cho); ? 02/08 17:40
2F:推 LPH66:在scanf後面加个getchar 02/08 18:12
3F:→ LPH66:那是因为你按的 Enter 还没被吃掉 02/08 18:12
※ 编辑: clarkman 来自: 220.134.31.176 (02/08 21:47)
4F:→ clarkman:williamyu 我试过,没有用,因为我是要清scanf的换行 02/08 21:51
5F:→ clarkman:LPH66的方法可以,我之前有试过类似的方法,不过就觉得 02/08 21:51
6F:→ clarkman:想不通..我就是为了清掉ENTER才写fflush..为什麽没用阿@@ 02/08 21:52
7F:→ clarkman:不过能解决问题^^...谢谢 02/08 21:52
8F:推 HudsonE:我想你误解了 fflush 的意思了... 02/08 21:55
9F:→ clarkman:多谢楼上提醒!!我的确观念错误~~查到资料了 02/08 22:03