[問題] fgets
我想先用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
02/08 17:40, 1F
推
02/08 18:12, , 2F
02/08 18:12, 2F
→
02/08 18:12, , 3F
02/08 18:12, 3F
※ 編輯: clarkman 來自: 220.134.31.176 (02/08 21:47)
→
02/08 21:51, , 4F
02/08 21:51, 4F
→
02/08 21:51, , 5F
02/08 21:51, 5F
→
02/08 21:52, , 6F
02/08 21:52, 6F
→
02/08 21:52, , 7F
02/08 21:52, 7F
推
02/08 21:55, , 8F
02/08 21:55, 8F
→
02/08 22:03, , 9F
02/08 22:03, 9F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章