[問題] fgets

看板C_and_CPP (C/C++)作者 (涼雨)時間16年前 (2009/02/08 17:28), 編輯推噓3(306)
留言9則, 4人參與, 最新討論串1/1
我想先用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)

02/08 17:40, , 1F
改成 scanf(" %c",&cho); ?
02/08 17:40, 1F

02/08 18:12, , 2F
在scanf後面加個getchar
02/08 18:12, 2F

02/08 18:12, , 3F
那是因為你按的 Enter 還沒被吃掉
02/08 18:12, 3F
※ 編輯: clarkman 來自: 220.134.31.176 (02/08 21:47)

02/08 21:51, , 4F
williamyu 我試過,沒有用,因為我是要清scanf的換行
02/08 21:51, 4F

02/08 21:51, , 5F
LPH66的方法可以,我之前有試過類似的方法,不過就覺得
02/08 21:51, 5F

02/08 21:52, , 6F
想不通..我就是為了清掉ENTER才寫fflush..為什麼沒用阿@@
02/08 21:52, 6F

02/08 21:52, , 7F
不過能解決問題^^...謝謝
02/08 21:52, 7F

02/08 21:55, , 8F
我想你誤解了 fflush 的意思了...
02/08 21:55, 8F

02/08 22:03, , 9F
多謝樓上提醒!!我的確觀念錯誤~~查到資料了
02/08 22:03, 9F
文章代碼(AID): #19ZgMipQ (C_and_CPP)
文章代碼(AID): #19ZgMipQ (C_and_CPP)