C語言中g(shù)etchar和putchar的使用方法詳解
一、認識getchar和putchar
getchar 是以行為單位進行存取的
當用 getchar 進行輸入時,如果輸入的第一個字符為有效字符(即輸入是文件結(jié)束符 EOF ,Windows下為組合鍵 Ctrl+Z , Unix/Linux下為組合鍵 Ctrl+D )
那么只有當最后一個輸入字符為換行符 '\n' (也可以是文件結(jié)束符 EOF , EOF 將在后面討論)時, getchar 才會停止執(zhí)行,整個程序?qū)聢?zhí)行。
代碼示例:
while((c = getchar()) != EOF){
putchar(c);
}執(zhí)行程序,輸入:abc,然后回車。
則程序就會去執(zhí)行 putchar(c) ,然后輸出abc,這個地方不要忘了,系統(tǒng)輸出的還有一個回車。然后可以繼續(xù)輸入,再次遇到換行符的時候,程序又會把那一行的輸入的字符輸出在終端上。
對于 getchar ,肯定很多初學的朋友會問, getchar 不是以字符為單位讀取的嗎?
那么,既然我輸入了第一個字符a,肯定滿足while循環(huán) (c = getchar()) != EOF)的條件呀,那么應(yīng)該執(zhí)行 putchar(c) 在終端輸出一個字符a。
不錯,我在用 getchar 的時候也是一直這么想的,但是程序就偏偏不著樣執(zhí)行,而是必需讀到一個 換行符 或者 文件結(jié)束符EOF 才進行一次輸出。
對這個問題的一個解釋是:
在編寫C的時候,當時并沒有所謂終端輸入的概念,所有的輸入實際上都是按照文件進行讀取的,文件中一般都是以行為單位的。因此,只有遇到換行符,那么程序會認為輸入結(jié)束,然后采取執(zhí)行程序的其他部分。
同時,輸入是按照文件的方式存取的,那么要結(jié)束一個文件的輸入就需用到 EOF (Enf Of File).。這也就是為什么 getchar 結(jié)束輸入退出時要用 EOF 的原因。
代碼示例:
#include <stdio.h>
int main()
{
int c;
c = getchar();
while (c != EOF)
{
putchar();
c= getchar();
}
return 0;
}這里主要解釋下為什么要用 int 型來接受 getchar 函數(shù)。
很多時候,我們會寫這樣的兩行代碼:
char c; c = getchar();
這樣就很有可能出現(xiàn)問題。
因為 getchar 函數(shù)除了返回終端輸入的字符外,在遇到Ctrl+D(Linux下)即文件結(jié)束符EOF時, getchar () 的返回 EOF ,這個 EOF 在函數(shù)庫里一般定義為 -1 。
因此,在這種情況下, getchar 函數(shù)返回一個負值,把一個負值賦給一個 char 型的變量是不正確的。
二、例題
1.下面用一個題目來看其實如何獲取字符和輸出字符的
代碼示例:
#include <stdio.h>
int main()
{
char c,d,e,f;
printf("please input two characters:\n");
c=getchar();
putchar(c);
putchar('\n');
d=getchar();
putchar(d);
putchar('\n');
e=getchar();
putchar(e);
putchar('\n');
f=getchar();
putchar(f);
putchar('\n');
printf("c= %c\n",c);
printf("d= %c\n",d);
printf("e= %c\n",e);
printf("f= %c\n",f);
} 運行后先輸入“12”,回車,再輸入“34”,回車。
運行環(huán)境是VSCode2019
代碼結(jié)果:

下面具體解釋一下:
- getchar 函數(shù)每次從緩沖區(qū)中得到一個字符, putchar 函數(shù)每次輸出一個字符。
- 首先輸入了兩個字符12,然后回車,注意這時寫入緩存中的有3個字符: 1 , 2 , 回車 。
- 程序中有四個 getchar() ,于是 c='1' , d='2' , e='\n' 。
- 這時運行到 f=getchar() ;輸入緩存中的三個字符均被前三個 getchar 獲取,這時需要用戶輸入,
- 這里輸入了34
- 于是 f='3' ,4和后面的回車沒有被利用。
- 這便是整個流程。
2.設(shè)計一個輸入密碼的程序
代碼示例:
#include <stdio.h>
int main()
{
int password[100] = { 0 };
printf("請輸入密碼:>");
// 數(shù)組名是首元素地址,不用加&
scanf("%d", password);
getchar();
printf("請確認密碼(Y/N):>");
char ch = getchar();
if (ch == 'Y')
printf("確認成功\n");
else if (ch == 'N')
printf("確認失敗\n");
else
printf("輸入錯誤\n");
return 0;
}運行結(jié)果:

- 這里的getchar()就是為了消除緩沖區(qū)。你以為到這里就結(jié)束了嗎?其實還沒有...
- 假如現(xiàn)在問題復雜了,有的人可能會把密碼輸成123 456\n (123和456中間是空格)
我們來看圖:

這時候我們可以寫一個while循環(huán)
#include <stdio.h>
int main()
{
int password[100] = { 0 };
printf("請輸入密碼:>");
// 數(shù)組名是首元素地址,不用加&
scanf("%d", password);
//為了消除\n
while (getchar() != '\n')
{
;
}
printf("請確認密碼(Y/N):>");
char ch = getchar();
if (ch == 'Y')
printf("確認成功\n");
else if (ch == 'N')
printf("確認失敗\n");
else
printf("輸入錯誤\n");
return 0;
}代碼結(jié)果:

總結(jié):
getchar讀取了空格、空格是不是都不等于\n為真。進入循環(huán)后啥也不干,就單純把它們“吃掉”,最后讀取到\n為假。跳出循環(huán)。
以上便是getchar() 和putchar() 的一些基本用法
今天講了getchar和putchar的使用方法,如有不對之處,請多多指正!
到此這篇關(guān)于C語言中g(shù)etchar和putchar的使用方法詳解的文章就介紹到這了,更多相關(guān)C語言 getchar()與putchar()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 求數(shù)組最大最小值函數(shù)的實現(xiàn)
這篇文章主要介紹了c++ 求數(shù)組最大最小值函數(shù)的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
C++實現(xiàn)TCP客戶端及服務(wù)器Recv數(shù)據(jù)篩選處理詳解
這篇文章主要為大家介紹了C++實現(xiàn)TCP客戶端及服務(wù)器Recv數(shù)據(jù)篩選處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語言入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09

