scanf
int scanf ( const char * format, ... );
The additional arguments should point to already allocated objects of the type specified by their corresponding format specifier within the format string.
scanf()函數是通用終端格式化輸入函數,它從標準輸入設備(鍵盤) 讀取輸入的信息。可以讀入任何固有類型的數據並自動把數值變換成適當的機內格式。其調用格式爲:scanf("<格式化字符串>",<地址表>);scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
/////////////////轉載的一點///////////////////////////
其控制串由三類字符構成:
1、格式化說明符;
2、空白符;
3、非空白符;
(A)格式化說明符
格式字符 說明
%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,ll同上h,l但僅對C99有效。
(B)空白字符
空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符,空白符可以是space,tab,newline等等,直到第一個非空白符出現爲止。
(C) 非空白字符
一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
①
例1.
#include "stdio.h"
int main(void)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
運行時按如下方式輸入三個值:
輸入:3□4□5
輸出:3,4,5
(1) &a、&b、&c中的&是地址運算符,分別獲得這三個變量的內存地址。
(2) "%d%d%d"是按十進值格式輸入三個數值。輸入時,在兩個數據之間可以用一個或多個空格、tab鍵、回車鍵分隔。
以下是合法輸入方式:
① 3□□4□□□□5↙
② 3↙
4□5↙
③ 3(tab鍵)4↙
5↙
例2.
#include "stdio.h"
int main(void)
{
int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
return 0;
}
運行時按如下方式輸入三個值:
輸入:3,4,5
或者
3,□4,□5
3,□□□4,□5
......
都是合法的,但是","一定要跟在數字後面,如:
3□,4,□5 ↙就非法了,程序出錯。
②
scanf()的格式控制串可以使用其它非空白字符,但在輸入時必須輸入這些字符。
例:
scanf("%d,%d",&a,&b);
輸入: 3,4 ↙(逗號與"%d,%d"中的逗號對應)
scanf("a=%d,b=%d",&a,&b);
輸入: a=3,b=4 ↙("a=","b=",逗號與"%d,%d"中的"a=","b="及逗號對應)
3、在用"%c"輸入時,空格和“轉義字符”均作爲有效字符。
例:
scanf("%c%c%c",&c1,&c2,&c3);
輸入:a□b□c↙
結果:a→c1,□→c2,b→c3 (其餘被丟棄)
scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、“回車”、“跳格”鍵。
② 遇寬度結束。
③ 遇非法輸入。
在使用scanf時我們經常碰到一個鍵盤緩衝區殘餘的信息問題,比如說:
int main()
{
int a;
char c;
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c\n",a,c);
}while(c!='N');
}
最後,我們再來說一下如何讓scanf接收有空格的字符串,例如"Hello world!"運行出錯的程序: 使用了空格控制符後:#include <stdio.h> #include <stdio.h>int main() int main(){ {int i; int i;char j; char j;for(i = 0;i < 10;i++) for(i = 0;i < 10;i++){ {scanf("%c",&j);/*這裏%前沒有空格*/ scanf(" %c",&j);/*注意這裏%前有個空格*/} }} }
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str);
}
輸出:Hello
① 遇空格、“回車”、“跳格”鍵。
② 遇寬度結束。
③ 遇非法輸入。