C語(yǔ)言中g(shù)etchar和putchar的使用方法詳解
一、認(rèn)識(shí)getchar和putchar
getchar
是以行為單位進(jìn)行存取的
當(dāng)用 getchar
進(jìn)行輸入時(shí),如果輸入的第一個(gè)字符為有效字符(即輸入是文件結(jié)束符 EOF
,Windows下為組合鍵 Ctrl+Z
, Unix/Linux下為組合鍵 Ctrl+D
)
那么只有當(dāng)最后一個(gè)輸入字符為換行符 '\n'
(也可以是文件結(jié)束符 EOF
, EOF
將在后面討論)時(shí), getchar
才會(huì)停止執(zhí)行,整個(gè)程序?qū)?huì)往下執(zhí)行。
代碼示例:
while((c = getchar()) != EOF){ putchar(c); }
執(zhí)行程序,輸入:abc,然后回車(chē)。
則程序就會(huì)去執(zhí)行 putchar(c)
,然后輸出abc,這個(gè)地方不要忘了,系統(tǒng)輸出的還有一個(gè)回車(chē)。然后可以繼續(xù)輸入,再次遇到換行符的時(shí)候,程序又會(huì)把那一行的輸入的字符輸出在終端上。
對(duì)于 getchar
,肯定很多初學(xué)的朋友會(huì)問(wèn), getchar
不是以字符為單位讀取的嗎?
那么,既然我輸入了第一個(gè)字符a,肯定滿(mǎn)足while循環(huán) (c = getchar()) != EOF)的條件呀,那么應(yīng)該執(zhí)行 putchar(c) 在終端輸出一個(gè)字符a。
不錯(cuò),我在用 getchar
的時(shí)候也是一直這么想的,但是程序就偏偏不著樣執(zhí)行,而是必需讀到一個(gè) 換行符 或者 文件結(jié)束符EOF 才進(jìn)行一次輸出。
對(duì)這個(gè)問(wèn)題的一個(gè)解釋是:
在編寫(xiě)C的時(shí)候,當(dāng)時(shí)并沒(méi)有所謂終端輸入的概念,所有的輸入實(shí)際上都是按照文件進(jìn)行讀取的,文件中一般都是以行為單位的。因此,只有遇到換行符,那么程序會(huì)認(rèn)為輸入結(jié)束,然后采取執(zhí)行程序的其他部分。
同時(shí),輸入是按照文件的方式存取的,那么要結(jié)束一個(gè)文件的輸入就需用到 EOF (Enf Of File).。這也就是為什么 getchar 結(jié)束輸入退出時(shí)要用 EOF 的原因。
代碼示例:
#include <stdio.h> int main() { int c; c = getchar(); while (c != EOF) { putchar(); c= getchar(); } return 0; }
這里主要解釋下為什么要用 int 型來(lái)接受 getchar 函數(shù)。
很多時(shí)候,我們會(huì)寫(xiě)這樣的兩行代碼:
char c; c = getchar();
這樣就很有可能出現(xiàn)問(wèn)題。
因?yàn)?strong> getchar 函數(shù)除了返回終端輸入的字符外,在遇到Ctrl+D(Linux下)即文件結(jié)束符EOF時(shí), getchar () 的返回 EOF ,這個(gè) EOF 在函數(shù)庫(kù)里一般定義為 -1 。
因此,在這種情況下, getchar 函數(shù)返回一個(gè)負(fù)值,把一個(gè)負(fù)值賦給一個(gè) char 型的變量是不正確的。
二、例題
1.下面用一個(gè)題目來(lái)看其實(shí)如何獲取字符和輸出字符的
代碼示例:
#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); }
運(yùn)行后先輸入“12”,回車(chē),再輸入“34”,回車(chē)。
運(yùn)行環(huán)境是VSCode2019
代碼結(jié)果:
下面具體解釋一下:
- getchar 函數(shù)每次從緩沖區(qū)中得到一個(gè)字符, putchar 函數(shù)每次輸出一個(gè)字符。
- 首先輸入了兩個(gè)字符12,然后回車(chē),注意這時(shí)寫(xiě)入緩存中的有3個(gè)字符: 1 , 2 , 回車(chē) 。
- 程序中有四個(gè) getchar() ,于是 c='1' , d='2' , e='\n' 。
- 這時(shí)運(yùn)行到 f=getchar() ;輸入緩存中的三個(gè)字符均被前三個(gè) getchar 獲取,這時(shí)需要用戶(hù)輸入,
- 這里輸入了34
- 于是 f='3' ,4和后面的回車(chē)沒(méi)有被利用。
- 這便是整個(gè)流程。
2.設(shè)計(jì)一個(gè)輸入密碼的程序
代碼示例:
#include <stdio.h> int main() { int password[100] = { 0 }; printf("請(qǐng)輸入密碼:>"); // 數(shù)組名是首元素地址,不用加& scanf("%d", password); getchar(); printf("請(qǐng)確認(rèn)密碼(Y/N):>"); char ch = getchar(); if (ch == 'Y') printf("確認(rèn)成功\n"); else if (ch == 'N') printf("確認(rèn)失敗\n"); else printf("輸入錯(cuò)誤\n"); return 0; }
運(yùn)行結(jié)果:
- 這里的getchar()就是為了消除緩沖區(qū)。你以為到這里就結(jié)束了嗎?其實(shí)還沒(méi)有...
- 假如現(xiàn)在問(wèn)題復(fù)雜了,有的人可能會(huì)把密碼輸成123 456\n (123和456中間是空格)
我們來(lái)看圖:
這時(shí)候我們可以寫(xiě)一個(gè)while循環(huán)
#include <stdio.h> int main() { int password[100] = { 0 }; printf("請(qǐng)輸入密碼:>"); // 數(shù)組名是首元素地址,不用加& scanf("%d", password); //為了消除\n while (getchar() != '\n') { ; } printf("請(qǐng)確認(rèn)密碼(Y/N):>"); char ch = getchar(); if (ch == 'Y') printf("確認(rèn)成功\n"); else if (ch == 'N') printf("確認(rèn)失敗\n"); else printf("輸入錯(cuò)誤\n"); return 0; }
代碼結(jié)果:
總結(jié):
getchar讀取了空格、空格是不是都不等于\n為真。進(jìn)入循環(huán)后啥也不干,就單純把它們“吃掉”,最后讀取到\n為假。跳出循環(huán)。
以上便是getchar() 和putchar() 的一些基本用法
今天講了getchar和putchar的使用方法,如有不對(duì)之處,請(qǐng)多多指正!
到此這篇關(guān)于C語(yǔ)言中g(shù)etchar和putchar的使用方法詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 getchar()與putchar()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 求數(shù)組最大最小值函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了c++ 求數(shù)組最大最小值函數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱(chēng)
本文主要介紹了C++獲取當(dāng)前正在運(yùn)行函數(shù)的名稱(chēng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04基于C語(yǔ)言實(shí)現(xiàn)高級(jí)通訊錄的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)高級(jí)通訊錄的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2023-01-01C++實(shí)現(xiàn)TCP客戶(hù)端及服務(wù)器Recv數(shù)據(jù)篩選處理詳解
這篇文章主要為大家介紹了C++實(shí)現(xiàn)TCP客戶(hù)端及服務(wù)器Recv數(shù)據(jù)篩選處理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10詳解C語(yǔ)言中的rename()函數(shù)和remove()函數(shù)的使用方法
這篇文章主要介紹了詳解C語(yǔ)言中的rename()函數(shù)和remove()函數(shù)的使用方法,是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09