[問題] 關於fflush的使用時機

看板C_and_CPP (C/C++)作者 (沒有存在感的人)時間10年前 (2015/06/10 21:32), 編輯推噓4(4016)
留言20則, 6人參與, 最新討論串1/2 (看更多)
使用Lubuntu + gcc 4.9.2 問題(Question): 目前在練習file input/output 有個疑問是如何不要讓前面輸入的Enter影響到後面 看了一下自己手上的書「邊學邊做C語言」是用fflush(stdin) 不過我加進去以後根本沒反應,輸入完要求的char+Enter程式就直接跑到底 然後看了版友的建議用while(getchar()!='\n'); (不過我不太懂,這邊最後一個getchar()不是輸入完要求的char打的'\n'嗎?) 可是的確有用,程式的確停下來叫我輸入string 稍微看了一下好像有些大大說不能用fflush(stdin) 可是google一下發現很多人都在用 我自己對fflush的認識也是把之前輸入到buffer裡的清掉 還是我對fflush的認識有誤? 感謝各位協助。 程式同步分享在此: https://gist.github.com/gnitnaw/ac3dbcd8fa8e11c515c8 #include <stdio.h> #define MAXSIZE 256 void read_string(char* p); //可以用scanf或fgets替代,我兩個都不滿意所以自己寫 int main(void) { char c, s[MAXSIZE]; puts("I/O lib"); puts(""); printf("Please give me a char: "); c = getchar(); printf("What you keyin is %c\n", c); fflush(stdin); while(getchar()!='\n'); printf("Please give me a string : "); read_string(s); printf("What you keyin is %s\n", s); printf("\n Press <Enter> to continue..."); while ((c=getchar()) != '\n'); return 0; } void read_string(char* p) { int i; char c; for (i=0; i<MAXSIZE-1; ++i) { if ( (c=getchar()) != '\n' ) { p[i] = c; } else { break; } } p[i] = '\0'; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.134.196 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1433943163.A.756.html

06/10 22:01, , 1F
未看先貼 C++ https://goo.gl/iRWqV9
06/10 22:01, 1F

06/10 22:04, , 2F
......兄台我不是來問作業的
06/10 22:04, 2F

06/10 22:07, , 3F
作業連結的「補充」
06/10 22:07, 3F

06/10 22:09, , 4F
C99標準未定義fflush所以不建議使用
06/10 22:09, 4F

06/10 22:12, , 5F
相同的問題 http://goo.gl/2uGUBB
06/10 22:12, 5F

06/10 22:40, , 6F
好久沒看到fflush(stdin)的問題了...XD
06/10 22:40, 6F

06/10 22:45, , 7F
樓上說的對, 標準不建議使用stdin
06/10 22:45, 7F

06/10 23:12, , 8F
johnhmj兄台: 補充在哪?還是我眼殘?
06/10 23:12, 8F

06/10 23:56, , 9F
cin.clear cin.sync cin.get
06/10 23:56, 9F

06/11 00:09, , 10F
我會用cin cout,但是現在在針對C的語法做特訓中...
06/11 00:09, 10F

06/11 01:19, , 11F
gets_s
06/11 01:19, 11F

06/11 02:00, , 12F
main.c → while(((c=getchar())!='\n')&(c!=EOF));
06/11 02:00, 12F

06/11 02:01, , 13F
main.cpp → cin.clear, cin.sync;
06/11 02:01, 13F

06/11 02:03, , 14F
假如while用在C++會無效,只能用在C
06/11 02:03, 14F

06/11 02:06, , 15F
修正!main.cpp → cin.clear(), cin.sync();
06/11 02:06, 15F

06/11 02:10, , 16F
while(EOF) 在 C++ 要用 cin.eof(), 用法跟 C 的 feof 相同
06/11 02:10, 16F

06/11 02:10, , 17F
也都要注意這兩者都是讀取失敗之"後"才會成立
06/11 02:10, 17F

06/11 02:10, , 18F
就算你在尾巴, 沒讀過還是不知道沒了
06/11 02:10, 18F

06/11 02:22, , 19F
scanf("%*[^\n]%*1[\n]"); scanf 很好用o_o
06/11 02:22, 19F

06/11 02:33, , 20F
可是scanf遇到空格就停掉了 @@
06/11 02:33, 20F
文章代碼(AID): #1LU3nxTM (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1LU3nxTM (C_and_CPP)