C語言scanf()解析

從鍵盤到內存

在這裏插入圖片描述
鍵盤輸入“a b c abc回車”
會將鍵盤輸入內容緩存至鍵盤緩存區,等待程序中scanf() 讀取

a 空格 b 空格 c 空格 a b c 回車

scanf原型

int scanf(const char * restrict format,...);

返回值爲成功讀取數據個數
例:

#include<stdio.h>
int main()
{
	int a,b,c;
	printf("%d",scanf("%d %d %d",&a,&b,&c));
}	

運行環境:win7、 Dev-C++ 5.11

在用“%c”格式輸入字符時,空白字符(space,tab,newline)和“轉義字符”都作爲有效字符輸入。

輸入:12 w d 回車
運行結果:
在這裏插入圖片描述

scanf中參數中 不屬於格式指令的字符 的作用

空白字符

空白字符會使scanf函數在讀操作中略去輸入中的一個或多個空白字符;
常見使用scanf()賦多值時使用
例(程序讀取時沒有跳過空白字符):

#include<stdio.h>
int main()
{
	char a,b,c;
	static int num;
	
	scanf("%c%c%c",&a,&b,&c);
	printf("讀取到的字符爲:%c,%c,%c;",a,b,c);
}

輸入“a b c回車”
在這裏插入圖片描述
例(程序讀取時使用空白字符做分割):

#include<stdio.h>
int main()
{
	char a,b,c;
	static int num;
	
	scanf("%c %c %c",&a,&b,&c);
	printf("讀取到的字符爲:%c,%c,%c;",a,b,c);
}

輸入:“a b c回車”
a,b之間一個空格,b,c之間兩個空格

在這裏插入圖片描述
輸入“ a b c回車”:
a前面有空格
在這裏插入圖片描述
第一個讀取到的字符爲"空格",讀取到的“空格”後面沒有跟其他空格,所以不需要剔除空格,之間開始第二個字符“a”的讀取,第二個字符後面跟着空格,剔除空格後繼續讀取第三個字符"d"。
可參考 非空白字符在格式說明符後面 部分

非空白字符

一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。

非空白字符在格式說明符後面

讀取到一個字符時,檢測後面是否有參數中的非空白字符,如果有,則剔除掉該字符(只能剔除一次該字符,不能像空白字符一樣可以剔除發多次)。 ``` #include

輸入:“atbtct回車”
輸出:
在這裏插入圖片描述

輸入:“ttttttt回車” //輸入7個t
輸出:
在這裏插入圖片描述

t t t t t t t 回車
讀取 刪除 讀取 刪除 讀取 刪除 讀取 回車

非空白字符在格式說明符前面

讀取字符時得先檢測到非空白字符纔會讀取字符(以 t 爲例)。

#include<stdio.h>
int main()
{
	char ch;
	char chs[100];
	static int num;
	while(scanf("t%c",&ch))//此處讀取
	{
		num++;
		printf("%c\t",ch);
		printf("%d\n",num);
	}
	scanf("%s",&chs);
	printf("剩餘在鍵盤緩衝區的未被讀取的字符爲:\n");
	printf("%s\n",chs);
} 

輸入:“abcdefg回車”
輸出:
在這裏插入圖片描述
輸入:“tatbcdef回車”
輸出:
在這裏插入圖片描述

補充:

在用“%c”格式輸入字符時,空白字符和“轉義字符”都作爲有效字符輸入。
在用“%s”格式輸入字符時,輸入的字符串中含有空白字符,字符串讀取結束。

參考網址:

關於C/C++ stdin緩衝區以及對字符輸入的一些經驗和心得
https://blog.csdn.net/ShannonNansen/article/details/76090172
百度百科:scanf()
https://baike.baidu.com/item/scanf/10773316?fr=aladdin
scanf函數詳解與緩衝區
https://blog.csdn.net/c_base_jin/article/details/24135463

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章