函數 scanf() 是從標準輸入流stdio (標準輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字符,並保存在對應地址的變量中。
其調用格式爲: scanf(“<格式化字符串>”,<地址表>);
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
格式字符串包括三種字符“格式化符“,如”%d,%c,%s”等;”空白符”,如空格,製表符,新行符;”非空白符”,如”,”等。
空白符:空白字符會使scanf函數在讀操作中略去輸入中的一個或多個空白字符。
非空白符:一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。
如:scanf(“%d%d”,&a,&b);
或scanf(“%d %d”,&a,&b); 輸入時: 1 2
scanf(“%d,%d”,&a,&b); 輸入時:1,2
關鍵:在用格式化符%c時,空格,轉義符均爲有效字符;
例:scanf(“%c%c%c”,&a,&b,&c);
輸入:a□b□c
則:a=’a’,b=’□’,c=’b’
實際遇到的問題:
int main()
4 {
5 char a,b;
6 scanf("%c",&a);
7 scanf("%c",&b);
8 printf("%c %c",a,b);
9 return 0;
10 }
gdb調試:
6 scanf("%c",&a);
(gdb) n
a
7 scanf("%c",&b);
(gdb) n
8 printf("%c %c",a,b);
(gdb) p a
$1 = 97 'a'
(gdb) p b
$2 = 10 '\n'
當輸入完a的值後,回車也被b接受,在實際運行輸入完a就直接打印a結束。
優化:
int main()
4 {
5 char a,b;
6 scanf("%c",&a);
7 getchar();
8 scanf("%c",&b);
9 printf("%c %c",a,b);
10 return 0;
11 }
在scanf前加上getchar();
6 scanf("%c",&a);
(gdb) n
a
7 getchar();
(gdb) n
8 scanf("%c",&b);
(gdb)
b
9 printf("%c %c",a,b);
(gdb) n
10 return 0;
(gdb) p a
$1 = 97 'a'
(gdb) p b
$2 = 98 'b'
百度百科getchar機制:
當程序調用getchar時.程序就等着用戶按鍵。用戶輸入的字符被存放在鍵盤緩衝區中。直到用戶按回車爲止(回車字符也放在緩衝區中)。當用戶鍵入回車之後,getchar纔開始從stdio流中每次讀入一個字符。如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待後續getchar調用讀取。也就是說,後續的getchar調用不會等待用戶按鍵,而直接讀取緩衝區中的字符,直到緩衝區中的字符讀完爲後,纔等待用戶按鍵。
fflush(stdin)函數:對於上面情況處理無效,還沒能搞懂,此處保留。