gets()和scanf()函式的區別,以及對清空緩衝區概念的理解
阿新 • • 發佈:2019-01-26
scanf()
在一個字串中遇到空格、回車、Tab結束,不接受遇到的空格、回車、Tab控制符後面的字元輸入語句,將讀入的是空格、回車、tab控制符。
如果想要讀取可以採用%[]輸入;
書寫格式:%9[^\n],表示不包含\n,輸入接受任何非回車字元,結束條件要麼輸入字元達到9個要麼輸入回車,如果超過9個則後面的會被省略 scanf(" %9[^\n] ", str ); |
問題:看下面一段程式碼
輸出結果:#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { char arr[10] = { 0 }; char c = 0; scanf("%s", arr); c = getchar(); printf("%s\n%c", arr, c); system("pause"); return 0; }
【現象】輸完arr按回車準備輸入c的時候程式直接結束,並且輸出了arr,c為回車。
【解決方法】在多個輸入型函式之間從在緩衝區概念,每次輸入完一個函式都要清空緩衝區。具體解決方法如下:
(1)在scanf()後面再加一個沒用的getchar(),用於接收回車,並丟棄。
(2)在scanf()後面加fflush(stdin);清空緩衝區。注:高等vs不適用
(3)萬能法:在scanf()後面加一個
while (getchar() != '\n')
{
;
}
gets()
遇到回車結束,併吞掉回車符。下一個字元輸入語句,將讀入回車以後的字元。
例:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { char arr[10] = { 0 }; char c = 0; gets(arr); c = getchar(); printf("%s\n%c", arr, c); system("pause"); return 0; }
結果: