1. 程式人生 > >gets()和scanf()函式的區別,以及對清空緩衝區概念的理解

gets()和scanf()函式的區別,以及對清空緩衝區概念的理解

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;
}

結果: