連續調用scanf的問題總結


    對於非常簡單的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", &amp;a,&amp;b);
    printf("input c\n");
    scanf("%d", &amp;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", &amp;a);
    scanf("%c",&amp;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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM