這篇文章要探討的是“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,在如今博客界的轉載抄襲泛濫的環境下,原創不易,點個贊再走唄。以下是博客首頁的鏈接。