一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 詳細聊聊c語言中的緩沖區問題

詳細聊聊c語言中的緩沖區問題

2022-02-28 15:06厚積薄發 C/C++

緩沖區又稱為緩存,它是內存空間的一部分,也就是說在內存空間中預留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數據,這部分預留的空間就叫做緩沖區,這篇文章主要給大家介紹了關于c語言中緩沖區問題的相關資料,需要

發現問題

你是不是總會出現當你輸入的時候(你想的是只輸出一個內容),但是最后卻輸入兩個。

比如下面這個例子

詳細聊聊c語言中的緩沖區問題

 那這到底是是哪出了問題呢?

沒錯這就是關于緩沖區的問題。

我們先仔細了解這個題目

例題

判斷字母是否為元音字母包括大小寫。

看代碼實現(錯誤的)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int main()
{
    int i = 0;
    char ch = 0;
    char yyzm[20] = { 'a','A','e','E','i','I','o','O','u','U' };
    while(scanf("%c", &ch)!=EOF)
    {
        for (i = 0; i < 10; i++)
        {
            if (ch == yyzm[i])
            {
                printf("元音字母\n");
                break;
            }
        }
        if (i == 10)
        {
            printf("輔音字母\n");
        }
    }
    
    return 0;
}

問題原因

我們一般怎么輸入呢?

我們先輸入元音字母o然后在按一下回車,一般輸入都是這樣輸入的到底是哪出了問題呢?

沒錯就是那個回車惹的禍。每當我們輸入一個字母的時候,scanf讀取字母之后,就會放入緩沖區中,回車一下當然也會放個'\n'字符也就是空格,當計算機拿取字符的時候先拿走一個字符,接著看里面還有沒有字符,如果有字符就會繼續讀取,如果沒有則進行下面的內容。

在我們這個代中由于是多次輸入數據,就會讀入字符后第一個if語句結束,如果還有字符的話,計算機就會繼續拿字符,這時就拿了一個'\n','\n'不是元音字母就會進入下一個if語句輸出。

那我們如何解決呢?

解決方法一:

在后面加入getchar(),它的作用就是清理緩存區,由于輸入字符,計算機是一個一個字符讀取的,又因為我們多次輸入,所以getchar總是會讀取那個'\n';

解決方法二:

我們在scanf%c后面加個'\n',由于是一個一個讀取字符的,如果后面有'\n',就會把\n也拿走。

解決方案三:

在%c前面加個空格,這樣做的目的是每次讀取下一個字符時,就會把上一個字符后面的'\n'清理掉。

正確的代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
int main()
{
    int i = 0;
    char ch = 0;
    char yyzm[20] = { 'a','A','e','E','i','I','o','O','u','U' };
    while(scanf(" %c", &ch)!=EOF)//可以在%c后面加個'\n',也可以在%c前面加個空格,目的是清理緩沖區
    {
        for (i = 0; i < 10; i++)
        {
            if (ch == yyzm[i])
            {
                printf("元音字母\n");
                break;
            }
        }
        if (i == 10)
        {
            printf("輔音字母\n");
        }
    }
    //getchar();清理緩沖區
    return 0;
}

出錯二

當我們用scanf輸入字符串的時候,如果遇到空格也會出現問題,這時我們就可以引入另外一個函數那就是gets函數

gets函數引入

gets函數的優點與scanf對比:

gets() 函數不僅比 scanf 簡潔,而且,就算輸入的字符串中有空格也可以直接輸入,不用像 scanf 那樣要定義多個字符數組。

關于使用 gets() 函數需要注意:使用 gets() 時,系統會將最后“敲”的換行符從緩沖區中取出來,然后丟棄,所以緩沖區中不會遺留換行符。這就意味著,如果前面使用過 gets(),而后面又要從鍵盤給字符變量賦值的話就不需要吸收回車清空緩沖區了,因為緩沖區的回車已經被 gets() 取出來扔掉了。(此段話是在網上查到的,整理為復習準備,請見諒)。

我們來做個題吧

逆序字符串

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
#include<string.h>
void swap(char* str)
{
    int i = 0;
    int len = strlen(str);
    for (i = 0; i < len / 2; i++)
    {
        char tmp = 0;
        tmp = str[i];
        str[i] = str[len - i - 1];
        str[len - i - 1] = tmp;
    }
    printf("%s", str);
}
int main()
{
    //逆序字符串的內容
    char str[100];
    int i = 0;
    gets(str);
    swap(str);
 
    return 0;
}

詳細聊聊c語言中的緩沖區問題

為什么要引入緩沖區

比如我們從磁盤里取信息,我們先把讀出的數據放在緩沖區,計算機再直接從緩沖區中取數據,等緩沖區的數據取完后再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數,再加上計算機對緩沖區的操作大大快于對磁盤的操作,故應用緩沖區可大大提高計算機的運行速度。

又比如,我們使用打印機打印文檔,由于打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應的緩沖區,打印機再自行逐步打印,這時我們的CPU可以處理別的事情。

現在您基本明白了吧,緩沖區就是一塊內存區,它用在輸入輸出設備和CPU之間,用來緩存數據。它使得低速的輸入輸出設備和高速的CPU能夠協調工作,避免低速的輸入輸出設備占用CPU,解放出CPU,使其能夠高效率工作。 

緩沖區的類型

緩沖區 分為三種類型:全緩沖、行緩沖和不帶緩沖。

1) 全緩沖

在這種情況下,當填滿標準I/O緩存后才進行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。

2) 行緩沖

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

3) 不帶緩沖

也就是不進行緩沖,標準出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。

總結

到此這篇關于c語言中的緩沖區的文章就介紹到這了,更多相關c語言中的緩沖區內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/m0_61210742/article/details/121439002

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
主站蜘蛛池模板: 激性欧美激情在线aa | 操穴勤| 欧美性理论片在线观看片免费 | 国产精品久久久久久久久久久搜索 | a免费看| 国产综合亚洲专区在线 | 日本无卡码一区二区三区 | 女仆色永久免费网站 | 色多多视频在线 | 成人精品一区久久久久 | 日韩视频免费看 | 92国产福利视频一区二区 | 99精品在线视频观看 | 久久性生大片免费观看性 | 高h孕交| 91大神在线精品播放 | 农村脱精光一级 | 五月最新女厕所高跟嘘嘘 | 水蜜桃一二二区视在线 | 99热99在线 | 国产资源免费 | jj免费视频| 91麻豆精东果冻天美传媒老狼 | 护士被多人调教到失禁h | 无码国产成人777爽死 | 91欧洲在线视精品在亚洲 | 6个老师的尿奴 | 好大好长好紧爽免费 | 日韩大片免费看 | 大又大又粗又爽女人毛片 | 久久日韩精品无码一区 | 男人狂躁女人下面狂叫图片 | 动漫在线观看h | 美女禁18| 日剧整部剧护妻狂魔免费观看全集 | 午夜AV国产欧美亚洲高清在线 | 好吊色视频988gao在线观看 | 青青青草免费 | 天天操天天干天天舔 | 亚洲精品第一国产综合 | 91大神在线精品播放 |