getchar
- getchar決議
- 一、getchar的回傳型別及作用機制
- 二、根據一段代碼初步了解
- 三、實體(“輸入密碼”)進一步了解
- 1、代碼達不到理想效果
- (1)原理詳解
- (2)解決措施
- 2、輸入的密碼中有空格
- (1)原理詳解
- (2)解決措施
getchar決議
一、getchar的回傳型別及作用機制
getchar——讀取字符的函式
int getchar(void)
回傳型別為int,引數為void.
有人可能會有疑惑,getchar既然是讀取字符的,為什么回傳型別是int呢?
1、getchar其實回傳的是字符的ASCII碼值(整數),
2、getchar在讀取結束或者失敗的時候,會回傳EOF,
EOF意思是end of file,本質上是-1.
二、根據一段代碼初步了解
下面我們一起來看看下面這段代碼什么意思
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
意思是
getchar先讀取一個字符放到ch里面去,如果這個字符不等于EOF,就進入回圈,列印這個字符,當getchar讀到檔案末尾或者結束時,它會回傳一個EOF,此時結束回圈,
我們來運行試一下

輸入A,輸出A;輸入b,輸出b…
當我們想要結束時,輸入ctrl+Z,再按回車即可,
注意,如果上面的代碼不用while回圈的話,輸入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,根據我們輸入的是N還是Y列印“確認成功”或“確認失敗”,
我們來運行一下,看看是否是這樣

可以看到,我們還沒有輸入Y或N,他就立馬跳出來了一個“確認失敗”
為什么會是這樣呢?

(1)原理詳解
我們來看看它其中的原理:
scanf和getchar都是輸入函式,它們都是從鍵盤上來讀取我們的資料,但它們不是直接從鍵盤上來讀取我們的資料,它們和鍵盤之間有一個區域叫緩沖區,
輸入函式先來看緩沖區中是否有資料,如果有,它直接就拿走了,不需要從鍵盤輸入,如果緩沖區什么都沒有,則需要從鍵盤輸入,再拿走,

明白這個道理后,我們回到上面那串代碼,
最開始緩沖區里沒有東西,所以我們這行代碼
scanf("%s", password);
就是從鍵盤輸入密碼,我們輸入123456,為了讓123456放進去,我們還敲了一個回車,所以緩沖區里為
123456\n
接下來就是scanf來讀緩沖區里的字串了,scanf讀取的方式是讀取\n之前的內容,所以讀取的是123456.
printf("請確認密碼(Y/N):>");后,就是下面這行代碼:
int ch = getchar();
getchar用來接收字符,

getchar看到緩沖區中有資料(\n),直接取走,不需要從鍵盤輸入,自然也就出現了我們上面運行結果的那一幕:還沒輸入N或Y,就立馬跳出“確認失敗”了,
(2)解決措施
那么我們怎么解決這個問題呢?
很自然就能想到需要先把緩沖區里清空,
那我們就在前面加一個getchar把緩沖區中的“\n”給清理掉,
即代碼變為
#include<stdio.h>
int main()
{
char password[20] = {0};
printf("請輸入密碼:>");
scanf("%s", password);
getchar();//把緩沖區中的\n清理掉
printf("請確認密碼(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功\n");
}
else
{
printf("確認失敗\n");
}
return 0;
}
運行一下即可發現,現在能夠得到我們的理想結果,

2、輸入的密碼中有空格
不過又有一個問題,當我們輸入密碼為123456 789時(中間有一個空格),還沒等我們輸入N或Y,又立馬跳出了“確認失敗”,
這又是怎么回事呢?我們一起來看看
(1)原理詳解
首先緩沖區里沒有東西,我們需要通過鍵盤輸入密碼123456 789,

然后scanf就來取緩沖區中的資料,當它讀到空格的時候,它就不再讀了(這是scanf的一個作用性質),
所以scanf就只取走了123456,而緩沖區中還剩下(空格) 789\n,

再往下,運行到getchar();這行代碼,然而這里只有一個getchar,它只能讀取一個字符,也就是只讀了空格,緩沖區中還剩789\n,

再往下,就是我們的這行代碼int ch = getchar();
getchar()一來就取走了緩沖區中的7,根本不需要我們從鍵盤輸入N或Y,運行時自然它就自動跳出了“確認錯誤”,
(2)解決措施
所以我們需要把緩沖區中的東西先全部清走,
那我們就用一個回圈,只要沒讀到\n,我們就一直用getchar讀,
即
//把緩沖區中的內容全讀走
while ( getchar() != '\n')
{
;
}
整段代碼如下:
#include<stdio.h>
int main()
{
char password[20] = {0};
printf("請輸入密碼:>");
scanf("%s", password);
//把緩沖區中的內容全讀走
while ( getchar() != '\n')
{
;
}
printf("請確認密碼(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("確認成功\n");
}
else
{
printf("確認失敗\n");
}
return 0;
}
運行一下

是我們想要的效果,
以上就是關于getchar的用法的實體決議,如果對你有幫助,記得點贊👍+關注哦!
我的主頁還有其他文章,歡迎學習指點,
關注我,讓我們一起學習,一起成長吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294749.html
標籤:其他
上一篇:01時間復雜度和空間復雜度

