摘要:
本文闡述了基於ANSI,Win 95,Win NT上的 C/C++語言中scanf()函數的用法,以及在實際使用中常見錯誤及對策。
關鍵詞:
scanf()
一、 序言
在CSDN論壇的C/C++版塊,我時常見到“對於scanf()函數的用法、及出現的各種錯誤而迷惑”的帖子,萌發了我寫這篇文章的念頭。文中結合自身在學習和編程中對它的認識和體會,以具體示例闡述問題,目的在於使得初學者能夠正確使用scanf()函數,少走不必要的彎路。
二、 scanf()函數的用法
scanf()函數是格式化輸入函數,它從標准輸入設備(鍵盤) 讀取輸入的信息。
其調用格式為: scanf("<格式化字符串>",<地址表>);
格式化字符串包括以下三類不同的字符;
1、 格式化說明符:
格式化說明符與printf()函數中的格式說明符基本相同。但和printf()函數中格式字符串的用法有一些小區別。我們來看下面這個表。
格式字符
說明
%d
從鍵盤輸入十進制整數
%o
從鍵盤輸入八進制整數
%x
從鍵盤輸入十六進制整數
%c
從鍵盤輸入一個字符
%s
從鍵盤輸入一個字符串
%f
從鍵盤輸入一個實數
%e
與%f的作用相同
附加格式說明字符表
字符
說明
L
輸入"長"數據
H
輸入"短"數據
M
指定輸入數據所占寬度
*
空讀一個數據
2、 空白字符: 空白字符會使scanf()函數在讀操作中略去輸入中的一個或多個空白字符。
3、 非空白字符: 一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
地址表是需要讀入的所有變量的地址,而不是變量本身。這與printf()函數完全不同,要特別注意。各個變量的地址之間同","分開。
例如:
#include <stdio.h>
void main()
{
int i, j;
printf("i, j=?\n");
scanf("%d, %d", &i, &j);
}
上例中的scanf()函數先讀一個整型數,然後把接著輸入的逗號剔除掉,最後讀入另一個整型數。如果","這一特定字符沒有找到,scanf()函數就終止。若參數之間的分隔符為空格,則參數之間必須輸入一個或多個空格。
說明:
(1) 對於字符串數組或字符串指針變量,由於數組名和指針變量名本身就是地址,因此使用scanf()函數時,不需要在它們前面加上"&"操作符。
例如:
#include <stdio.h>
void main()
{
char *p, str[20];
p = new char[20];
scanf("%s", p); /*從健盤輸入字符串*/
scanf("%s", str);
printf("%s\n", p); /*向屏幕輸出字符串*/
printf("%s\n", str);
}
(2) 可以在格式化字符串中的"%"各格式化規定符之間加入一個整數,表示任何讀操作中的最大位數。
如上例中若規定只能輸入10字符給字符串指針p,則第一條scanf() 函數語句變為:scanf("%10s", p);
程序運行時一旦輸入字符個數大於10,p就不再繼續讀入,而後面的一個讀入函數即scanf("%s", str)就會從第11個字符開始讀入。
(3) scanf()函數中沒有精度控制。
如: scanf("%5.2f",&a); 是非法的。不能企圖用此語句輸入小數為2位的實數。
(4) scanf中要求給出變量地址,如給出變量名則會出錯
如 scanf("%d",a);是非法的,應改為scnaf("%d",&a);才是合法的。