91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言scanf的工作原理是什么

發布時間:2022-01-04 17:15:07 來源:億速云 閱讀:250 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言scanf的工作原理是什么”,在日常操作中,相信很多人在C語言scanf的工作原理是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C語言scanf的工作原理是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

原理解釋

先來觀察一段代碼和運行結果:

#include <iostream>

using namespace std;

int main() {
    int a;
    char c;
    scanf("%d", &a);
    printf("a = %d", a);
    scanf("%c", &c);
    printf("c = %c", c);
}

C語言scanf的工作原理是什么

該代碼明明有兩個 scanf ,但在運行過程中,執行完第一個 scanf 和 printf 后,代碼直接停止了,并沒有繼續執行下一個 scanf ,這是為什么呢?

下面先介紹緩沖區原理。

行緩沖:在這種情況下,當在輸入和輸出中遇到換行符時,將執行真正的IO操作。這時,我們輸入的字符先存放到緩沖區中,等按下回車鍵換行時才進行實際的IO操作.典型代表是標準輸入緩沖區(stdin)和標準輸出緩沖區(stdout)。

如上面例子所示,我們向標準輸人緩沖區中放入的字符為 &lsquo;20\n&rsquo;,輸入&rsquo;\n&rsquo;(回車)后, scanf 函數才開始匹配, scanf 函數中的%d 匹配整型數 20 ,然后放入變量 i 中,接著進行打印輸出,這時 &lsquo;\n&rsquo; 仍然在標準輸入緩沖區(stdin)內,如果第二個 scanf 函數為 scanf("%d",&i) ,那么依然會發生阻塞,因為 scanf 函數在讀取整型數、浮點數、字符串(后面介紹數組時講解字符串)時,會忽略 '\n&rsquo; (回車符)、空格符等字符(忽略是指scanf 函數執行時會首先刪除這些字符,然后再阻塞), scanf 函數匹配一個字符時,會在緩沖區刪除對應的字符。因為在執行 scanf("%c",&c) 語句時,不會忽略任何字符,所以 scanf("%c",&c) 讀取了還在緩沖區中殘留的 &lsquo;\n&rsquo; 。

上面說的很專(啰)業(嗦),實際上就是:scanf 接收的是 %c,它把還存在緩沖區的 &lsquo;\n&rsquo; 當成了一個字符,導致了代碼結束,如果 scanf 接收的是其他類型的數據,則會忽略這個 &lsquo;\n&rsquo;,繼續運行下面的代碼,再舉一個例子:

#include <iostream>

using namespace std;

int main() {
    int a;
    int c;
    scanf("%d", &a);
    printf("a = %d", a);
    scanf("%d", &c);
    printf("c = %d", c);
}

C語言scanf的工作原理是什么

例如以上代碼,我輸入了好多個空格,但根本不影響實際的運行結果,因為它們都被 printf 在緩沖區內刪除掉了,scanf 是不會刪除緩沖區的內容的。

再來看一段代碼理解一下:

#include <iostream>

using namespace std;

#define EOF (-1)

int main() {
    int i;
    while (scanf("%d", &i) != EOF) {
        printf("i=%d\n", i);
    }
}

C語言scanf的工作原理是什么

以上的 scanf 輸入,是 10,20,a 的順序輸入,在輸入 a 之后,代碼一直打印上一個 printf 的內容,這是因為: scanf 返回的是成功讀入的數據項數,在我的輸入中輸入了一個 a ,a 是無法匹配 %d 的,scanf 也不會刪除 a ,所以 scanf 的返回值是 0(沒有成功匹配),不等于 -1 ,此時就會一直 while 循環。

并且,在 scanf 返回值為 0 的情況下,沒有讀取 i 的值,此時 i 的值還是上一次輸入的 20,這就會導致 while 循環一直打印上一次的 i=20。

C語言scanf的工作原理是什么

解決辦法

使用 rewind(stdin) 清空緩沖區:

#include <iostream>

using namespace std;

#define EOF (-1)

int main() {
    int i;
    while (rewind(stdin), scanf("%d", &i) != EOF) {
        printf("i=%d\n", i);
    }
}

C語言scanf的工作原理是什么

到此,關于“C語言scanf的工作原理是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵宝市| 朝阳县| 平罗县| 三河市| 蓝山县| 阿拉善左旗| 漯河市| 交城县| 临沧市| 抚松县| 萨嘎县| 日照市| 新和县| 靖安县| 观塘区| 凌源市| 衢州市| 长汀县| 呼伦贝尔市| 常德市| 大邑县| 鹿邑县| 察哈| 商南县| 临朐县| 北辰区| 古田县| 胶州市| 襄樊市| 朝阳市| 方城县| 集安市| 灵川县| 鄄城县| 巴东县| 和林格尔县| 泸西县| 安义县| 汉阴县| 全南县| 普安县|