• <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <span id="wslfv"></span>
    <tbody id="wslfv"><pre id="wslfv"></pre></tbody>
    <th id="wslfv"><track id="wslfv"><rt id="wslfv"></rt></track></th>

    <li id="wslfv"><acronym id="wslfv"></acronym></li>
    更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

    C語言中scanf函數的3種常見問題

    • 發布:嵌入式培訓
    • 來源:嵌入式資訊
    • 時間:2020-08-12 13:55

    在寫代碼時總是不小心在這里犯錯,所以特意查了一下這個函數,并且做以整理,現分享給大家。

    1.空白符問題

    #include<stdio.h>

    main()

    {

    int a;

    printf("input the data ");

    scanf("%d ",&a);//這里多了一個回車符

    printf("%d",a);

    return 0;

    }

    結果要輸入兩個數程序才結束,而不是預期的一個。why?

    原因:用空白符結尾時,scanf會跳過空白符去讀下一個字符,所以你必須再輸入一個數。這里的空白符包括空格,制表符,換行符,回車符和換頁符。所以如果你用scanf("%d ",&a)也會出現同樣的問題。

    解決方法:這種錯誤大多是輸入的時候不小心,多注意一點就好了。這種問題也不好檢查,編譯沒有問題,一個空格也不容易看出來。當你的程序出現上面的問題時,自己對照檢查一下就可以了。

    2.回車符也占位。

    #include <stdio.h>

    main()

    {

    int n = 5;

    char c[n];

    for(int i = 0; i < n; i++)

    c[i] = scanf("%c",&c[i]);

    printf(c);

    return 0;

    }

    如果輸入:

    a

    b

    c

    那么循環就會“提前”結束了.

    原因:輸入a和第一個回車后,a和這個回車符都留在緩沖區中。第一個scanf讀取了a,但是輸入緩沖區里面還留有一個 ,第二個scanf讀取這個 。然后輸入b和第二個回車,同樣的,第三個scanf讀取了b,第四個scanf讀取了第二個回車符。第五個讀取了c。所以五個scanf都執行了,并沒有提前結束。只不過有的scanf讀取到了回車符而已。

    解決方法:

    1.不輸入回車符,直接輸入字符。

    2.用gets()函數,如:

    #include<stdio.h>

    main()

    {

    char c[5];

    gets(c);

    printf(c);

    return 0;

    }

    3.scanf()函數的參數輸入類型不匹配問題

    這是我在百度時見到的問題,還沒遇到。拿來整理,以備日后需要。

    #include<stdio.h>

    main()

    {

    int a=123;

    char c='t';

    printf("input ");

    scanf("%d%c",&a,&c);

    scanf("%d%c",&a,&c);

    scanf("%d%c",&a,&c);

    printf("%d %c ",a,c);

    return 0;

    }

    當輸入a 回車 后,會直接跳過下面2個scanf語句,直接輸出為

    123

    t

    原因:對于scanf("%d%c",&a,&c),scanf語句執行時,其中有一個參數不匹配,那就從這個地方跳出,忽略這個scanf后面所有的參數,而去執行下一條語句。

    解決方法:scanf()函數執行成功時的返回值是成功讀取的變量數,也就是說,你這個scanf()函數有幾個變量,如果scanf()函數全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數據,鍵盤緩沖區就可能還有殘余信息問題。

    比如:

    #include <stdio.h>

    main()

    {

    int a=123,b;

    while(scanf("%d%d",&a,&b)!=2)

    fflush(stdin);

    printf("%d %d ",a,b);

    return 0;

    }

    還有個辦法:只要用scanf("%[^ ]",strings); 就可以了。很神奇吧。還要注意方括號兩側都不能加空格。

    最后,達內嵌入式培訓機構提醒每一個it愛好者:如果你想要在短時間內快速入門,順利掌握一門技術,建議還是認真學習視頻。多練習,多動手。

    版權聲明:轉載文章來自公開網絡,版權歸作者本人所有,推送文章除非無法確認,我們都會注明作者和來源。如果出處有誤或侵犯到原作者權益,請與我們聯系刪除或授權事宜。

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:想成為單片機高手這么簡單嗎?
    下一篇:STM32單片機必須掌握的八種IO口模式

    單片機:寫1清零,寫0清零,有什么區別?

    嵌入式工程師一定不要亂用全局變量

    嵌入式培訓靠譜嗎?就業怎么樣?

    新手如何學習單片機?

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    欧美一级高清片,一级欧美免费大片视频,欧美三级在线电影免费 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>