頭文件:#include <stdio.h>
scanf() 函數用來格式化輸入數據,即按用戶指定的格式從鍵盤上把數據讀入到指定的變量中。其原型為:int scanf ( char * format [ ,argument, ... ]);
【參數】format為格式化控制字符串,可以由三類字符構成。
1) 格式化說明符
------------------------------------------------------------
格式字符 說明
------------------------------------------------------------
%a 讀入一個浮點值(僅C99有效)
%A 同上
%c 讀入一個字符
%d 讀入十進制整數
%i 讀入十進制,八進制,十六進制整數
%o 讀入八進制整數
%x 讀入十六進制整數
%X 同上
%c 讀入一個字符
%s 讀入一個字符串
%f 讀入一個浮點數
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 讀入一個指針
%u 讀入一個無符號十進制整數
%n 至此已讀入值的等價字符數
%[] 掃描字符集合
%% 讀%符號
另外,還有附加格式說明字符,用於追加在上面的格式說明符後面。
-----------------------------------------------------------------
修飾符 說明
-----------------------------------------------------------------
L/l 長度修飾符,輸入"長"數據
h 長度修飾符,輸入"短"數據
W 整型常數,指定輸入數據所占寬度
* 星號,空讀一個數據
hh 同 h,但僅對C99有效
ll 同 l,但僅對C99有效
2) 空白字符
空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符,空白符可以是space,tab,newline等等,直到第一個非空白符出現為止。
3) 非空白字符
一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
argument 為需要讀入的所有變量的地址。
注意,是變量地址,而不是變量標識符:
如果是一般的變量,通常要在變量名前加上"&"取得地址,但輸出時是用變量名。
如果是數組,用數組名就代表了該數組的首地址,輸出時也是用數組名
如果是指針,直接用指針名本身,不要加上“*”,輸出時也用該指針即可。
【返回值】成功則返回被賦值的參數的個數。如果 format 和 argument 匹配錯誤,或者遇到結束符,那麼返回值可能小於參數的個數。
如果讀取發生錯誤,將會返回 EOF,並設置錯誤標識,後續可以通過 ferror() 檢測。
如果遇到結束符,將會設置文件結束標識,後續可以通過 feof() 檢測。
如果在讀取寬字符的時候發生編碼錯誤,那麼將會把 errno 設置為 EILSEQ。
【實例】下面的代碼將演示 scanf() 可以讀取的數據類型。
運行結果為:
Enter your family name: Soulie
Enter your age: 29
Mr. Soulie , 29 years old.
Enter a hexadecimal number: ff
You have entered 0xff (255).
又如,記錄帶空格的字符串,然後輸出(已經注釋的部分為要求輸入三個整數,然後逐個打印出來)。
#include<stdio.h>
int main()
{
/*int a,b,c;
puts("Input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
printf("\n%d,%d,%d\n",a,b,c);*/
// 可以輸入帶空格的字符串*/
char str[80];
scanf("%[^\n]",str); // 格式化輸入
printf("%s\n",str); // 格式化輸出
return 0;
}
【運行結果】
sdf ef13
sdf ef13
scanf() 函數是初學者接觸最多的函數,相信大家都 已非常熟悉,這裡不再贅述,但是它還有一個許多人都沒有注意到的功能,即可以記錄帶空格的字符串,注意學習例子中指定格式的方法。