亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

最新C語言中g(shù)etchar的使用

 更新時間:2022年12月06日 11:32:56   作者:可樂'  
getchar()是在輸入緩沖區(qū)順序讀入一個字符(包括空格、回車和Tab) ,getchar()是stdio.h中的庫函數(shù),它的作用是從stdin流中讀入一個字符,本文給大家介紹getchar的使用,感興趣的朋友跟隨小編一起看看吧

getchar的使用

1.從緩沖區(qū)讀走一個字符,相當(dāng)于清除緩沖區(qū)  

2.前面的scanf()在讀取輸入時會在緩沖區(qū)中留下一個字符'\n'(輸入完s[i]的值后按回車鍵所致),所以如果不在此加一個getchar()把這個回車符取走的話,gets()就不會等待從鍵盤鍵入字符,而是會直接取走這個“無用的”回車符,從而導(dǎo)致讀取有誤  

3.  
getchar()是在輸入緩沖區(qū)順序讀入一個字符(包括空格、回車和Tab)  
getchar()使用不方便,解決方法:   
(1)使用下面的語句清除回車:   
while(getchar()!='\n');   
(2)用getche()或getch()代替getchar(),其作用是從鍵盤讀入一個字符(不用按回車),注意要包含頭文件<conio.h>  

4. 
getchar()是stdio.h中的庫函數(shù),它的作用是從stdin流中讀入一個字符,也就是說,如果stdin有數(shù)據(jù)的話不用輸入它就可以直接讀取了,第一次getchar()時,確實需要人工的輸入,但是如果你輸了多個字符,以后的getchar()再執(zhí)行時就會直接從緩沖區(qū)中讀取了。  
實際上是 輸入設(shè)備->內(nèi)存緩沖區(qū)->程序getchar    
你按的鍵是放進(jìn)緩沖區(qū)了,然后供程序getchar    
你有沒有試過按住很多鍵然后等一會兒會滴滴滴滴響,就是緩沖區(qū)滿了,你后頭按的鍵沒有存進(jìn)緩沖區(qū).    
鍵盤輸入的字符都存到緩沖區(qū)內(nèi),一旦鍵入回車,getchar就進(jìn)入緩沖區(qū)讀取字符,一次只返回第一個字符作為getchar函數(shù)的值,如果有循環(huán)或足夠多的getchar語句,就會依次讀出緩沖區(qū)內(nèi)的所有字符直到'\n'.要理解這一點,之所以你輸入的一系列字符被依次讀出來,是因為循環(huán)的作用使得反復(fù)利用getchar在緩沖區(qū)里讀取字符,而不是getchar可以讀取多個字符,事實上getchar每次只能讀取一個字符.如果需要取消'\n'的影響,可以用getchar();來清除,這里getchar();只是取得了'\n'但是并沒有賦給任何字符變量,所以不會有影響,相當(dāng)于清除了這個字符.還要注意的是這里你在鍵盤上輸入ssss看到的回顯正是來自于getchar的作用,如果用getch就看不到你輸入了什么.

1、首先,我們看一下這段代碼:

它的簡單意思就是從鍵盤讀入一個字符,然后輸出到屏幕。理所當(dāng)然,我們輸入1,輸出就是1,輸入2,輸出就是2。

那么我們?nèi)绻敵龅氖?2呢?

它的輸出是1。

這里我們先簡單的解釋下,因為當(dāng)我們從鍵盤輸入字符‘1’,‘2’,并按下回車后,我們的輸入被放入了輸入緩沖區(qū),這個時候getchar()會從緩沖區(qū)中讀取我們剛才的輸入,一次只讀一個字符,所以字符1就被拿出來了,賦值給了c,然后putchar()又將c放在了標(biāo)準(zhǔn)輸出,也就是這里的屏幕,所以我們看見了最終的顯示結(jié)果1。同時字符‘1’也被緩沖區(qū)釋放了,而字符‘2’仍然被留在了緩沖區(qū)。而這樣是很不安全的,有可能下次使用的時候,我們的緩沖區(qū)會讀到一些垃圾,但是當(dāng)程序結(jié)束的時候,它會自動刷新。

2、我們接著看下面的代碼:

大家覺得這幾行代碼是什么意思呢?大家是否真的看懂了呢?

如果你覺得你看懂了,那么我提一個問題,你覺得是不是你從鍵盤輸入一個字符就會輸出一個字符,直到遇見了換行符呢?

emmmmm。

如果你真的這么想了,那你就錯了。

它真正的運(yùn)行過程應(yīng)該是這樣的:還記得我們剛才說過的東西嗎,getchar()會從輸入緩沖區(qū)去讀取內(nèi)容,也就是說我們把所有的內(nèi)容都輸入完成并且按下了Enter鍵后,我們的輸入才被送進(jìn)去了輸入緩沖區(qū),這個時候,while循環(huán)才開始工作,每一次getchar()從輸入緩沖區(qū)讀取一個字符,然后如果不是換行符就輸出。

3、那么我們?yōu)槭裁匆褂镁彌_區(qū)呢?

舉個例子,我們知道計算機(jī)CPU的處理速度很快的,而我們鍵盤的輸入速度總是比不過CPU的處理速度,那么CPU就得一直等著鍵盤輸入完,這樣很浪費(fèi)資源。于是,我們黨鍵盤輸入完了,再讓CPU一次性處理,這樣就會大大地提高效率。

又比如,我們的打印機(jī)打印文檔,打印機(jī)的處理速度是很慢的,所以我們會將文檔輸出到打印機(jī)的緩存中去,這樣打印機(jī)就可以自行慢慢打印,而不必占用CPU資源。

4、緩沖區(qū)的類型

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

  1、全緩沖

  在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。

  2、行緩沖

  在這種情況下,當(dāng)在輸入和輸出中遇到換行符時,執(zhí)行真正的I/O操作。這時,我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時才進(jìn)行實際的I/O操作。典型代表是鍵盤輸入數(shù)據(jù)。

  3、不帶緩沖

  也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。

5、緩沖區(qū)的刷新

緩沖區(qū)會在以下三種情況下被刷新:

1、緩沖區(qū)滿

2、執(zhí)行flush刷新緩沖區(qū)的語句

3、程序正常結(jié)束。

首先,用getchar()函數(shù)進(jìn)行字符的輸入,并不是直接從鍵盤這個硬件中讀取輸入的字符,而是從“輸入緩沖區(qū)”中得到的字符。
輸入緩沖區(qū)是一個字符的隊列,其中存儲了所有你尚未讀取的字符。
每次調(diào)用getchar函數(shù),它就會從輸入緩沖區(qū)中讀出第一個字符,并把這個字符從輸入緩沖區(qū)中清除。
然而,這個輸入緩沖區(qū)的設(shè)計,是把所有從鍵盤上輸入的東西都放進(jìn)去的,包括你每次按的回車符‘\n’,
而getchar函數(shù)只讀走了你在回車前輸入的那個字符,而將回車符保留在了輸入緩沖區(qū)中。
于是,第二次調(diào)用getchar時,函數(shù)就從輸入緩沖區(qū)中讀出了'\n'。
要解決這個問題,有兩種可行的途徑。
一是多加一個getchar(),過濾掉回車,但是這種方法有不足,就是如果你在調(diào)用第一個getchar時輸入了多個字符,
那么,加入一個getchar并不能把所有未讀取的字符過濾。如果你的本意是重新從“鍵盤”讀取的話,最好是加一個
fflush(stdin);
清除輸入緩沖區(qū)

擴(kuò)展知識:

C語言】getchar 函數(shù)的正確使用

一、getchar 函數(shù)

在這里插入圖片描述

從上面的介紹來看,我們要正確使用getchar函數(shù),首先得了解什么是緩沖區(qū)。

二、緩沖區(qū)

1、什么是緩沖區(qū)

緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分。

也就是說,在內(nèi)存空間中預(yù)留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。

緩沖區(qū)根據(jù)其對應(yīng)的是輸入設(shè)備輸出設(shè)備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。

2、為什么要存在緩沖區(qū)

我們?yōu)槭裁匆刖彌_區(qū)呢?

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

又比如,我們使用打印機(jī)打印文檔,由于打印機(jī)的打印速度相對較慢,我們先把文檔輸出到打印機(jī)相應(yīng)的緩沖區(qū),打印機(jī)再自行逐步打印,這時我們的CPU可以處理別的事情。現(xiàn)在您基本明白了吧,緩沖區(qū)就是一塊內(nèi)存區(qū),它用在輸入輸出設(shè)備和CPU之間,用來緩存數(shù)據(jù)。它使得低速的輸入輸出設(shè)備和高速的CPU能夠協(xié)調(diào)工作,避免低速的輸入輸出設(shè)備占用CPU,解放出CPU,使其能夠高效率工作。

3、緩沖區(qū)的類型

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

1、全緩沖
在這種情況下,當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才進(jìn)行實際I/O操作。全緩沖的典型代表是對磁盤文件的讀寫。

2、行緩沖
在這種情況下,當(dāng)在輸入和輸出中遇到換行符時,執(zhí)行真正的I/O操作。這時,我們輸入的字符先存放在緩沖區(qū),等按下回車鍵換行時才進(jìn)行實際的I/O操作。典型代表是鍵盤輸入數(shù)據(jù)。

3、不帶緩沖
也就是不進(jìn)行緩沖,標(biāo)準(zhǔn)出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。

4、緩沖區(qū)的刷新

以下四種情況會引發(fā)緩沖區(qū)刷新:

  • 緩沖區(qū)滿時;
  • 執(zhí)行 flush 語句;
  • 執(zhí)行 endl 語句;
  • 關(guān)閉文件。

三、getchar 函數(shù)的正確使用

1、getchar 的換行問題

我們來觀察下面這段代碼

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = (getchar())) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

在這里插入圖片描述

我們可以看到我們每次從鍵盤輸入一個字符并回車后,putchar輸出時會自動換行,就是因為我們每次除了輸入字符外,還敲了一個回車,而這個回車會被存儲在緩沖區(qū)中,當(dāng)我們用getchar讀取字符時,會從緩沖區(qū)中依次逐個讀取所有的字符(包括換行、空格、Tab),直到緩沖區(qū)中沒有數(shù)據(jù),每讀取一個字符就用putchar打印一下,所以這里會自動換行。

在這里插入圖片描述

^Z:Ctrl+Z,輸入后會被認(rèn)定為EOF,從而來結(jié)束循環(huán)(VS中有些時候要重復(fù)按三次才會結(jié)束循環(huán),其他編譯器都是按一次)。

2、getchar 與 scanf 的混合使用

我們來觀察下面這段代碼:

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("請輸入密碼:>");
	scanf("%s", password);
	printf("請確認(rèn)密碼(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認(rèn)成功\n");
	}
	else
	{
		printf("確認(rèn)失敗\n");
	}
	return 0;
}

在這里插入圖片描述

我們可以看到程序并沒有等待我們輸入Y/N來確認(rèn)密碼,而是直接結(jié)束,原因就是我們緩沖區(qū)中存放的是abcdef\n,而scanf函數(shù)是遇到空格、換行符(\n)、Tab時結(jié)束,所以\n并沒有被讀取走,而是繼續(xù)留在了緩沖區(qū)中,而當(dāng)getchar讀取數(shù)據(jù)時發(fā)現(xiàn)緩沖區(qū)中并不為空,所以直接讀取了\n,然后判斷if條件,結(jié)束程序,而不會等待我們輸入Y/N。

那么要如何避免這種情況發(fā)生呢?有兩種方法:
法一:在scanf后面加一個getchar(不推薦)

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("請輸入密碼:>");
	scanf("%s", password);
	getchar();  //讀取剩下的\n
	printf("請確認(rèn)密碼(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認(rèn)成功\n");
	}
	else
	{
		printf("確認(rèn)失敗\n");
	}
	return 0;
}

在這里插入圖片描述

我們在scanf函數(shù)后面加上一個getchar函數(shù),用于清空緩沖區(qū)里面多余的\n,但是這種方法有弊端,不推薦使用,具體弊端如下:

在這里插入圖片描述

如圖:我們從鍵盤輸入abcd ef,我們可以看到,程序并沒有等待我們輸入Y/N,而是直接執(zhí)行if語句,這是因為 scanf函數(shù)遇到空格、換行符(\n)、Tab時會停止讀取,所以緩沖區(qū)中剩下的字符是_ef\n,一次getchar無法清空緩沖區(qū)。所以說,法一只能解決一部分情況,想要徹底解決scanf緩沖區(qū)殘留的問題需要用到法二。

法二:在scanf后面加 while( getchar() != ‘\n’) 語句(推薦)

#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("請輸入密碼:>");
	scanf("%s", password);
	getchar();  //讀取剩下的\n
	printf("請確認(rèn)密碼(Y/N):>");
	while (getchar() != '\n')
	{
		;
	}
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("確認(rèn)成功\n");
	}
	else
	{
		printf("確認(rèn)失敗\n");
	}
	return 0;
}

在這里插入圖片描述

在這里插入圖片描述

程序中的while( getchar() != ‘\n’)語句會不斷讀取緩沖區(qū)中的字符,直到把\n讀取走,從而達(dá)到清空緩沖區(qū)的目的。

到此這篇關(guān)于最新C語言中g(shù)etchar的使用的文章就介紹到這了,更多相關(guān)getchar的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)折半查找

    C++實現(xiàn)折半查找

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)折半查找,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++ 成員變量的初始化順序問題詳解

    C++ 成員變量的初始化順序問題詳解

    這篇文章主要介紹了C++ 成員變量的初始化順序問題詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • c語言基于stdarg.h的可變參數(shù)函數(shù)的用法

    c語言基于stdarg.h的可變參數(shù)函數(shù)的用法

    本篇文章主要介紹了c語言基于stdarg.h的可變參數(shù)函數(shù)的用法,詳細(xì)的介紹了可變參數(shù)函數(shù)的詳細(xì)用法和源碼實例,有興趣的可以了解一下
    2017-07-07
  • c++類型轉(zhuǎn)換及RTTI運(yùn)行階段類型識別

    c++類型轉(zhuǎn)換及RTTI運(yùn)行階段類型識別

    這篇文章主要為大家介紹了c++類型轉(zhuǎn)換及RTTI運(yùn)行階段類型識別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2023-05-05
  • C++中vector迭代器失效問題詳解

    C++中vector迭代器失效問題詳解

    vector是向量類型,它可以容納許多類型的數(shù)據(jù),如若干個整數(shù),所以稱其為容器,這篇文章主要給大家介紹了關(guān)于C++中vector迭代器失效問題的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C語言#define拼接宏定義實現(xiàn)方式

    C語言#define拼接宏定義實現(xiàn)方式

    今天小編就為大家分享一篇C語言#define拼接宏定義實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 標(biāo)準(zhǔn)C++類string的Copy-On-Write技術(shù)

    標(biāo)準(zhǔn)C++類string的Copy-On-Write技術(shù)

    這里,我想從C++類或是設(shè)計模式的角度為各位揭開Copy-On-Write技術(shù)在string中實現(xiàn)的面紗,以供各位在用C++進(jìn)行類庫設(shè)計時做一點參考
    2013-11-11
  • C/C++實現(xiàn)線性順序表的示例代碼

    C/C++實現(xiàn)線性順序表的示例代碼

    使用順序存儲結(jié)構(gòu)的線性存儲結(jié)構(gòu)的表為線性順序表。本文將分別利用C語言和C++實現(xiàn)線性順序表,文中示例代碼講解詳細(xì),需要的可以參考一下
    2022-05-05
  • C語言詳細(xì)分析講解關(guān)鍵字goto與void的作用

    C語言詳細(xì)分析講解關(guān)鍵字goto與void的作用

    我們在C語言中經(jīng)常會見到void,也會偶爾見到goto,那么C語言中既然有g(shù)oto,為什么我們在代碼中見的很少呢?在以前很多的項目經(jīng)驗中,我們得到這樣一條潛規(guī)則:一般項目都是禁用goto的,程序質(zhì)量與goto的出現(xiàn)次數(shù)成反比。自后也就造成了我們一般不會使用goto
    2022-04-04
  • Qt正則表達(dá)式使用舉例

    Qt正則表達(dá)式使用舉例

    這篇文章主要給大家介紹了關(guān)于Qt正則表達(dá)式使用的相關(guān)資料,Qt中的正則表達(dá)式模式匹配功能由QRegExp類實現(xiàn),它完全支持Unicode,并可以應(yīng)用于字符串驗證、搜索、查找替換和分割等場景,需要的朋友可以參考下
    2024-02-02

最新評論