C語言中g(shù)etchar的用法以及實例解析
getchar解析
一、getchar的返回類型及作用機制
getchar——讀取字符的函數(shù)
int getchar(void)
返回類型為int,參數(shù)為void.
有人可能會有疑惑,getchar既然是讀取字符的,為什么返回類型是int呢?
1、getchar其實返回的是字符的ASCII碼值(整數(shù))。
2、getchar在讀取結(jié)束或者失敗的時候,會返回EOF。
EOF意思是end of file,本質(zhì)上是-1.
二、根據(jù)一段代碼初步了解
下面我們一起來看看下面這段代碼什么意思
#include<stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } return 0; }
意思是
getchar先讀取一個字符放到ch里面去,如果這個字符不等于EOF,就進入循環(huán),打印這個字符。當getchar讀到文件末尾或者結(jié)束時,它會返回一個EOF,此時結(jié)束循環(huán)。
我們來運行試一下
輸入A,輸出A;輸入b,輸出b…
當我們想要結(jié)束時,輸入ctrl+Z,再按回車即可。
注意,如果上面的代碼不用while循環(huán)的話,輸入123,putchar()只會輸出1。因為一個getchar一次只能讀取一個字符。
三、實例(“輸入密碼”)進一步了解
1、代碼達不到理想效果
我們再來看看下面這段代碼
#include<stdio.h> int main() { char password[20] = {0}; printf("請輸入密碼:>"); scanf("%s", password); printf("請確認密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認成功\n"); } else { printf("確認失敗\n"); } return 0; }
按理說,我們是想要輸入密碼,然后再輸入N或者Y,根據(jù)我們輸入的是N還是Y打印“確認成功”或“確認失敗”。
我們來運行一下,看看是否是這樣
可以看到,我們還沒有輸入Y或N,他就立馬跳出來了一個“確認失敗”
為什么會是這樣呢?
(1)原理詳解
我們來看看它其中的原理:
scanf和getchar都是輸入函數(shù),它們都是從鍵盤上來讀取我們的數(shù)據(jù),但它們不是直接從鍵盤上來讀取我們的數(shù)據(jù)。它們和鍵盤之間有一個區(qū)域叫緩沖區(qū)。
輸入函數(shù)先來看緩沖區(qū)中是否有數(shù)據(jù),如果有,它直接就拿走了,不需要從鍵盤輸入,如果緩沖區(qū)什么都沒有,則需要從鍵盤輸入,再拿走。
明白這個道理后,我們回到上面那串代碼。
最開始緩沖區(qū)里沒有東西,所以我們這行代碼
scanf("%s", password);
就是從鍵盤輸入密碼,我們輸入123456。為了讓123456放進去,我們還敲了一個回車,所以緩沖區(qū)里為
123456\n
接下來就是scanf來讀緩沖區(qū)里的字符串了,scanf讀取的方式是讀取\n之前的內(nèi)容,所以讀取的是123456.printf("請確認密碼(Y/N):>");
后,就是下面這行代碼:
int ch = getchar();
getchar用來接收字符,
getchar看到緩沖區(qū)中有數(shù)據(jù)(\n),直接取走,不需要從鍵盤輸入。自然也就出現(xiàn)了我們上面運行結(jié)果的那一幕:還沒輸入N或Y,就立馬跳出“確認失敗”了。
(2)解決措施
那么我們怎么解決這個問題呢?
很自然就能想到需要先把緩沖區(qū)里清空。
那我們就在前面加一個getchar把緩沖區(qū)中的“\n”給清理掉。
即代碼變?yōu)?/p>
#include<stdio.h> int main() { char password[20] = {0}; printf("請輸入密碼:>"); scanf("%s", password); getchar();//把緩沖區(qū)中的\n清理掉 printf("請確認密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認成功\n"); } else { printf("確認失敗\n"); } return 0; }
運行一下即可發(fā)現(xiàn),現(xiàn)在能夠得到我們的理想結(jié)果。
2、輸入的密碼中有空格
不過又有一個問題,當我們輸入密碼為123456 789時(中間有一個空格),還沒等我們輸入N或Y,又立馬跳出了“確認失敗”。
這又是怎么回事呢?我們一起來看看
(1)原理詳解
首先緩沖區(qū)里沒有東西,我們需要通過鍵盤輸入密碼123456 789,
然后scanf就來取緩沖區(qū)中的數(shù)據(jù),當它讀到空格的時候,它就不再讀了(這是scanf的一個作用性質(zhì))。
所以scanf就只取走了123456,而緩沖區(qū)中還剩下(空格) 789\n。
再往下,運行到getchar();
這行代碼,然而這里只有一個getchar,它只能讀取一個字符,也就是只讀了空格,緩沖區(qū)中還剩789\n。
再往下,就是我們的這行代碼int ch = getchar();
getchar()一來就取走了緩沖區(qū)中的7,根本不需要我們從鍵盤輸入N或Y。運行時自然它就自動跳出了“確認錯誤”。
(2)解決措施
所以我們需要把緩沖區(qū)中的東西先全部清走。
那我們就用一個循環(huán),只要沒讀到\n,我們就一直用getchar讀。
即
//把緩沖區(qū)中的內(nèi)容全讀走 while ( getchar() != '\n') { ; }
整段代碼如下:
#include<stdio.h> int main() { char password[20] = {0}; printf("請輸入密碼:>"); scanf("%s", password); //把緩沖區(qū)中的內(nèi)容全讀走 while ( getchar() != '\n') { ; } printf("請確認密碼(Y/N):>"); int ch = getchar(); if (ch == 'Y') { printf("確認成功\n"); } else { printf("確認失敗\n"); } return 0; }
運行一下
是我們想要的效果。
以上就是關(guān)于getchar的用法的實例解析。
總結(jié)
到此這篇關(guān)于C語言中g(shù)etchar的用法以及實例的文章就介紹到這了,更多相關(guān)C語言中g(shù)etchar用法實例內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++中#include <>與#include""的區(qū)別詳細解析
<>先去系統(tǒng)目錄中找頭文件,如果沒有在到當前目錄下找。所以像標準的頭文件 stdio.h、stdlib.h等用這個方法2013-10-10C++11?std::transform函數(shù)使用小結(jié)
std::transform是C++標準庫中的一個算法,它用于對輸入范圍內(nèi)的元素進行操作,并將結(jié)果存儲在輸出范圍內(nèi),本文就介紹了std::transform函數(shù)的具體使用,感興趣的可以了解一下2023-09-09