看板 C_and_CPP 關於我們 聯絡資訊
我想先用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)
williamyu:改成 scanf(" %c",&cho); ? 02/08 17:40
LPH66:在scanf後面加個getchar 02/08 18:12
LPH66:那是因為你按的 Enter 還沒被吃掉 02/08 18:12
※ 編輯: clarkman 來自: 220.134.31.176 (02/08 21:47)
clarkman:williamyu 我試過,沒有用,因為我是要清scanf的換行 02/08 21:51
clarkman:LPH66的方法可以,我之前有試過類似的方法,不過就覺得 02/08 21:51
clarkman:想不通..我就是為了清掉ENTER才寫fflush..為什麼沒用阿@@ 02/08 21:52
clarkman:不過能解決問題^^...謝謝 02/08 21:52
HudsonE:我想你誤解了 fflush 的意思了... 02/08 21:55
clarkman:多謝樓上提醒!!我的確觀念錯誤~~查到資料了 02/08 22:03