C语言getchar的用法_getchar的用法(W3Schools)
- getchar
getchar的定義
MSDN中的解釋是從流中讀取一個字符
int ch = getchar()
//通過getchar獲取字符的ASCII碼值傳到ch里面存儲
這里注意:getchar獲取字符以后 通過ASCII碼值的形式存儲在ch里
為什么不用char ch?
getchar讀到的是一個int類型的數據 好處是返回值的時候非常方便
接下來我們再看一個示例:
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
//這句話的意思是讀到了一個正常的字符
{
putchar(ch);//給啥打印啥
}
return 0;
}
什么是EOF?
EOF是文件結束的標志,系統定義為-1,返回失敗和錯誤的時候都會返回-1
當我們執行以上程序,會一直讀取字符并且換行,以下做出解釋:
1、為什么會自動換行?
當我們在鍵盤上敲入a的時候,getchar并沒有獲取,而是在我們敲回車以后才會進行讀取 這個時候我們輸入的其實是兩個字符 一個是’a’,另一個是’\n’
2、如何中止這個程序?
輸入Ctrl+Z進行中止,這個時候我們的輸入會有EOF的標志
3、當我們進行輸入的時候,真實的情況是什么樣的?
當我們輸入的時候并不是鍵盤直接到getchar,而是中間有一個輸入緩沖區,getchar一直在等待緩沖區里的內容,正是有了緩沖區的存在,才會出現有1的問題
4、我們如何清空緩沖區以免對后續操作造成影響呢?
我們作出以下研討:
情景模擬:我們需要設計一個簡易的登錄驗證密碼過程
int main()
{
//假設密碼是一個字符串
char password[20] = {
0 };
printf("請輸入密碼:>");
scanf("%s", password);//abc
printf("請確認密碼(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
//當我們輸入密碼以后,并沒有出現我們意料中的確認密碼輸入Y或者N的情況
//這個時候就是緩沖區出現問題
解釋:假設密碼為abc 程序沒能按想象的那樣輸入Y或者N
是因為 scanf只讀取abc不會讀取\n getchar最后拿到的是Y和\n或者N和\n
我們對代碼進行改進:
int main()
{
//假設密碼是一個字符串
char password[20] = {
0 };
printf("請輸入密碼:>");
scanf("%s", password);//abc
getchar();//讀取了\n
printf("請確認密碼(Y/N):>");
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
//再次運行一次,輸入abc def
表面上看 我們輸入abc的時候確實成功跑起來了
但是治標不治本 我們輸入abc def的時候
getchar讀到空格就不讀了 第二次getchar拿到的是空格 還剩def\n
多一個空格 程序又出錯了 所以這個時候我們需要用到剛剛的代碼,進行稍微的修改可以很好的清空緩沖區
int main()
{
//假設密碼是一個字符串
char password[20] = {
0 };
printf("請輸入密碼:>");
scanf("%s", password);//abc def
//scanf的特性是只讀到空格的地方就停止
int ch = 0;
while ((ch = getchar() != '\n'))
{
;
}
getchar();//讀取了\n
printf("請確認密碼(Y/N):>");
//這個時候緩沖區就只有Y或者N
int ret = getchar();
if ('Y' == ret)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
return 0;
}
總結
以上是生活随笔為你收集整理的C语言getchar的用法_getchar的用法(W3Schools)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux下如何解开.zip,.rar压
- 下一篇: Linux的启动流程是什么