作者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