getchar()函數的詳解以及使用時需要注意的一些細節-C語言基礎


 

在這里插入圖片描述
這篇文章要探討的是“getchar()函數的詳解以及使用時需要注意的一些細節”。涉及getchar()函數的應用和需要注意的問題。屬於C語言基礎篇(持續更新)。

在C語言的學習過程中,我們常常需要接收鍵盤的輸入,在接收鍵盤輸入的過程中涉及到的函數通常有三個getchar()scanf()fgets()。這三個函數各自的功能各不相同,需要我們根據不同的需求條件來選擇不同的輸入接收函數。而在這三個函數的使用過程中,有一些細節需要我們注意一下。所以接下來的三篇文章就是分別介紹這三個函數的。

getchar()(函數原型:int getchar(void))


一般用法:

char c = getchar();

getchar()函數的作用很簡單,從輸入緩存區中讀取一個字符,讀取到的字符儲存在返回值里面。


getchar()函數注意事項1:

對於你輸入的任何數據,getchar() 都會把它們當作是字符來處理,而且每次只獲取一個字符。例如你輸入“11”,getchar() 並不會把它當做“11”來處理,而是把它當做兩個‘1’來處理。同理,你輸入“3.14”它也不會當成“3.14”來處理而是當做‘3’、‘.’、‘1’、‘4’來處理,需要特別說明的是,像是換行符(\n)、回車符\歸位符(\r)、縮進符(\t)之類的轉義字符,它們雖然在代碼中的表示和我們平時說明中用的是兩個字符。但實際上它們在機器中存儲和還是以一個字符來存儲。所以別想着你敲個回車它能給你輸入‘/’和‘n’。我們表示是這么表示,但在機器內部它就還是一個字符而已。

對於換行符(\n)和回車符(\r)的區別我在這里簡單說一下。
換行符(\n)的作用是換一行輸出。回車符(\r)的作用是把光標回到該行的行首。這兩者的概念之所以有很多人會疑惑,這是由於我們平時的習慣稱呼導致的。我們習慣性的把鍵盤上面那個換行回車鍵稱為回車鍵,事實上它應該是兩個鍵的混合(\r\n)。
同時也因為我們現在的開發環境便捷導致的,在一般的開發環境下面換行符(\n)就已經相當於同時具備換行回車(\r\n)的功能了,所以我們平時對於(\n)用的就比較多,(\r)就比較少用了。
但是如果在一些不那么高級的開發環境(例如小型嵌入式系統)下面的話,情況就不一樣了,換行符(\n)就僅僅只是換行而已,你原本的光標在一行的哪個位置,就還在新行的哪個位置。你若想要光標回到行首,你就得手動輸出回車符(\r)。


getchar()函數注意事項2:

getchar()函數是會阻塞等待的。在程序調用getchar()函數的時候如果緩存區中沒有數據的話,getchar()函數便會阻塞等待用戶的輸入。


getchar()函數注意事項3:

getchar()的返回值做判斷的時候,需要考慮到是否存儲保留的問題。無論你是否接收getchar()的返回值,只要你調用了getchar(),那么緩存區中就會被讀取走一個字符。

這里用一個我曾經犯錯誤的例子來說明一下:

#include <stdio.h>
int main(void)
{
	char c[100] = {0};//創建一個數組來存儲輸入
	int i = 0;//記錄一共輸入了幾個字符,方便后面輸出。
	while(1)
	{
 		if(getchar() == ‘\n’)//先判斷輸入的是否是回車鍵
			break;
		c[i] = getchar();//再把判斷好的輸入值存儲起來
		i++;
	}
	for(int k = 0;k < i;k++)
		printf("%c", c[k]);//把存儲的值輸出
	printf("\n");
	return 0;
}

這個程序所要實現的功能是“程序運行之后,持續的讀取鍵盤的輸入一直到用戶輸入換行符為止,然后退出循環輸出讀取到的內容”。


先看一下這個程序出現的問題吧:

  • 運行的時候如果你輸入數據的字符個數為單數的時候,你需要輸入兩次回車才能結束程序,而且程序讀取到的輸入總是用戶輸入的一半,而且是隔一個讀取一個那種,最后面還多輸出一個回車。
    在這里插入圖片描述

  • 運行的時候如果你輸入數據的字符個數為雙數的時候,就還算正常,僅僅只是輸入少一半而已。
    在這里插入圖片描述


其實仔細分析一下,就不難看出,這兩種情況是可以歸類為一種情況的。如果你把第一種情況中第一次輸入的回車也看作一個字符的話,你就會發現,只有當你輸入數據的字符個數為雙數的時候,你下一個輸入的回車才能結束程序(也就是說如果我只在單數的時候輸入回車,那么這個程序就會一直運行下去,直到一開始給的數組內存大小不夠,程序訪問到了非法內存才會結束)。也是因為第一次輸入的回車被算進整體輸入里面去了,才導致了第一種情況的時候結尾多了個換行。
在這里插入圖片描述


再說一下原因吧:

出現這種情況的原因很簡單,相信不少人也已經看出來了。在這個例子中我在判斷輸入是否是“\n”的時候就已經讀取走一個字符了,后面再存儲的時候已經是第二個字符了,所以就造成了“讀取到的輸入只有實際輸入的一半這種情況”。


解決辦法:

解決辦法也不難,犧牲一個臨時變量來存儲輸入的數據,再判斷是否是回車鍵即可。

#include <stdio.h>
int main(void)
{
	char c[100] = {0};//儲存輸入數據用的數組
	int i = 0;//記錄輸入的字符個數方便輸出
	char z = 0;//解決方法就是加入臨時變量來先儲存再判斷
	while(1)
	{
 		z = getchar();//先儲存輸入的數據
		if(z == ‘\n’)//再判斷
			break;//如果是回車就退出循環
		c[i] = z;//如果不是回車就存儲
		i++;//計數加一
	}
	for(int k = 0;k < i;k++)
		printf("%c", c[k]);//把儲存的數據輸出
	printf("\n");
	return 0;
}

再附上這個例子的精簡版代碼:

#include <stdio.h>
int main(void)
{
        int i = 0;
        char c[100] = {0};
        while((c[i++] = getchar()) != '\n');
        for(int k = 0;k <= i;k++)
                printf("%c", c[k]);
        return 0;
}

getchar()函數注意事項4:

遇到再更新。。。


 原博客始發於CSDN,在如今博客界的轉載抄襲泛濫的環境下,原創不易,點個贊再走唄。以下是博客首頁的鏈接。


零BUG是原則性問題。


免責聲明!

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



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