2 回答

TA貢獻1784條經驗 獲得超8個贊
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);才是合法的。
(5) 在輸入多個數值數據時,若格式控制串中沒有非格式字符作輸入數據之間的間隔則可用空格,TAB或回車作間隔。
C編譯在碰到空格,TAB,回車或非法數據(如對“%d”輸入“12A”時,A即為非法數據)時即認為該數據結束。
(6) 在輸入字符數據(%c)時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。
例如:scanf("%c%c%c",&a,&b,&c);
輸入為:
d e f
則把'd'賦予a, ' (空格)'賦予b,'e'賦予c。因為%c 只要求讀入一個字符,后面不需要用空格作為兩個字符的間隔,因此把' '作為下一個字符送給b。
只有當輸入為:def 時,才能把'd'賦于a,'e'賦予b,'f'賦予c。 如果在格式控制中加入空格作為間隔,
如 scanf ("%c %c %c",&a,&b,&c);則輸入時各數據之間可加空格。
我們用一些例子來說明一些規則:
#include <stdio.h>
void main()
{
char a,b;
printf("input character a,b\n");
scanf("%c%c",&a,&b); /*注意兩個%c之間沒有任何符號*/
printf("%c%c\n",a,b);
}
由于scanf函數"%c%c"中沒有空格,輸入M N,結果輸出只有M。而輸入改為MN時則可輸出MN兩字符,見下面的輸入運行情況: input character a,b
MN (你輸入的值)
MN (屏幕上顯示的值)
#include <stdio.h>
void main()
{
char a,b;
printf("input character a,b\n");
scanf("%c %c",&a,&b); /*注意兩個%c之間有個空格*/
printf("\n%c%c\n",a,b);
}本例表示scanf格式控制串"%c %c"之間有空格時, 輸入的數據之間可以有空格間隔。
(7) 如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。
例如:
scanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“ , ”作間隔符,故輸入時應為: 5,6,7 (與scanf 雙引號之間的格式必須一樣)
又如: scanf("a=%d,b=%d,c=%d",&a,&b,&c);
則輸入應為 a=5,b=6,c=7
如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。
#include <stdio.h>
void main()
{
int a;
printf("input a number");
scanf("%d",&a);
printf("%ld",a);
}
由于輸入數據類型為整型, 而輸出語句的格式串中說明為長整型,因此輸出結果和輸入數據不符。輸出并不是輸入的值。
如將Scanf("%d",&a); 語句改為 scanf("%ld",&a);
輸入數據為長整型,輸入輸出數據才相等。
三、 常見錯誤及對策
問題1:
我初學C程序,所以提的問題很淺,希望您不要見笑。我自己編了一個程序,但運行的結果與我預期的不一樣。
#include<stdio.h>
void main()
{
static int a[2][3]={{1,3,4},{7,9,6}};
int i,j,k;
for(k=1;k<=2;k++)
{printf("Please input num:");
scanf("%d %d",&i,&j);
if(i<2&&j<3)
printf("num=%d\n",a[i][j]);
else printf("Input is error,\n");
}
printf("programm is complete.\n");
}
我想將第8行改為
scanf("i=%d j=%d",&i,&j);
則程序運行結果變成
please input num:i=1 j=2
num=6
num=6(我原本希望能重復第一行再讓我輸入)
Programm is complete.
為什么第二次不能輸入?
答復:
我使用Turbo C 2.0證實存在你說的問題。象scanf("i=%d j=%d",&i,&j);這樣的輸入方式比較特別,TC 2.0顯然在第一次輸入后沒有象正常情況一樣清楚輸入緩沖區,這樣第二次執行scanf時,程序并沒有讓你輸入而是直接讀入上次輸入的結果。如果你一定要這么做,應該在scanf之前加上:
fflush(stdin);
這樣清楚掉鍵盤緩沖區。

TA貢獻1900條經驗 獲得超5個贊
- 2 回答
- 0 關注
- 150 瀏覽
添加回答
舉報