對於非常簡單的scanf函數,一直使用,但是卻是有很多的知識點沒有掌握好,現總結如下:
1、多個scanf之后,后序以 scanf("%c",&c)
當程序連續調用scanf 函數的,前面的獲得輸入接收的時候,一般結束都是以一個空白字符(空格、enter),比如enter 結束輸入;但是,當后面接着是還有一個以 scanf("%c",&a) 的時候,則上面輸出 enter 作為結束符,就會被輸入到a,從而導致了a 為空。
(1)以%d 繼續輸入的時候:
<PRE>int main(void) { int a, b, c = 0; printf("input a,b\n"); scanf("%d,%d", &a,&b); printf("input c\n"); scanf("%d", &c); printf("a = %d, b = %d, c = %d\n", a, b, c); while (1); } input a,b 1,2 input c 3 a = 1, b = 2, c = 3</PRE>
(2)以%c繼續輸入的時候:
int main(void) { int a, b, c = 0; scanf("%d,%d", &a,&b); scanf("%c", &c); printf("a = %d, b = %d, c = %c\n", a, b, c); while (1); }
結果:
input a,b 1,2 a = 1, b = 2, c =
結果很神奇,當輸入1,2 結束輸入:enter之后,就直接是打印出了結果,c壓根就沒有手動輸入就被打印了出來。
原因解釋:
輸入a,b 值的時候,輸入的是: 1,2 enter 。當所以輸入的數據里面就有了三個數據,也就是: 1 2 enter,三個數據。當全部都是以 %d 格式作為輸入,1賦值給a,2賦值給b,但是enter 很顯然不是 %c 格式的,就被 pass 掉,只有當輸入的是數字的時候,並將輸入的數值3 賦值給 c。
當是以: %d,%d,%c 連續輸入的時候,我們知道,輸入的是1,2 enter,1賦值a,2賦值給b,而此時,%c,要求的是輸入一個字符,就會把 enter 賦值給 c,所以這就造成了 c 打印的結果為空。
scanf 的工作原理:
scanf 的工作原理是將用戶的任何輸入保存到緩沖區之中,當存在 scanf 的時候,則從緩沖區的隊列中讀取數據,直到遇見空白字符(空格、enter、tab、換頁符)的時候又或者不是本次輸入指定類型的時候,就結束這一次的輸入。所以,當連續輸入為 %d、%f、%x 等數據格式,則可以自動跳過空白字符,因為類型不匹配嘛,直到出現數字位為止;
解決的辦法:
(1)通過判斷是否輸入的為 enter
int main(int argc, char *argv[]) { int a, b, c = 0; scanf("%d,%d", &a, &b); do { scanf("%c", &ac); } while (c == '\n'); printf("a = %d, b = %d, c = %c\n", a, b, c); while (1); }
添加了 do while 循環,獲得輸入為真,也就是獲得的輸入為enter 或者其他的空白的字符的話,則循環輸入,當輸入的是要求的數據類型(%c)的時候,就退出循環體,保證可以獲得c值。
(2)輸入添加空白字符(空格)
<PRE>int main(int argc, char *argv[]) { int a, b, c = 0; scanf("%d,%d", &a, &b); scanf(" %c", &c); // %c 前面添加了空格,也就是前面是允許出現空格(enter) printf("a = %d, b = %d, c = %c\n", a, b, c); while (1); }</PRE>
其實就是scanf(" %c",&c),多添加了一個空格,。空格%c: 指定了輸入的內容是: 空格+%c 的模式。
2、連續多個字符的輸入
當需要連續輸入多個字符的時候:
<PRE>int main(int argc, char *argv[]) { char a, b; scanf("%c", &a); scanf("%c",&b); printf("a = %c, b = %c\n", a, b); while (1); }</PRE>
結果為:
a a = a, b =
還是會把 enter 賦值給b,
解決的辦法:
(1)添加空格
<PRE>int main(int argc, char *argv[]) { char a, b; scanf("%c", &a); scanf(" %c",&b); printf("a = %c, b = %c\n", a, b); while (1); }
結果輸入:
a b a = a, b = b
原因不做解釋,上面已經做好了解釋。
(2)添加 do while 去判斷
<PRE>int main(int argc, char *argv[]) { char a, b; scanf("%c", &a); do { scanf("%c", &b); } while ( b == '\n'); printf("a = %c, b = %c\n", a, b); while (1); }