4.5 C++函數概述 | 翻譯密碼
1248
2025-03-31
getchar()
頭文件:#include
【功能】讀取一個字符,并返回它的ASCII碼值
如果用戶在按回車鍵之前輸入了不只一個字符,其他字符會保留在鍵盤緩沖區中,等待后續系統調用讀取。也就是說,后續的系統調用不會等待用戶按鍵,而是直接讀取緩沖區中的字符,直到緩沖區的字符讀取完畢后,才等待用戶按鍵。
【參數】該函數沒有參數。
【返回值】讀取的字符的ASCII碼
【函數原型】 #define getchar() getc(stdin)
說明:本質是無參宏定義,但由于長相酷似函數,所以我們可以把gatcahr()當成函數看
【代碼實踐】
getchar是輸入字符的函數,括號內不能有參數
getchar('a'); //報錯
如果將getchar()執行時寫入整數會怎樣?
系統會將整數認為是字符,如下例:輸入了0,系統會將0認為是字符'0',輸出字符'0'的%d為:48
char a; a = getchar(); //輸入0 printf("%c,%d\n",a,a); //0,48
那只有0~9可以作為字符,如果輸入個大于9的數呢?
系統會取第一個數字作為輸入的字符,如下例:輸入23,系統只識別2,不識別3,并將2作為字符'2'輸出,輸出字符'2'的%d為:50
char a; a = getchar(); //輸入23 printf("%c,%d\n",a,a); //2,50
如果輸入好多個字符呢?
系統只取第一個字符,剩下的字符不管。如下例:輸入abc,系統只識別a,不識別bc,通過輸出結果也可看出來,請自行體會。
char a; a = getchar(); //輸入abc printf("%c,%d\n",a,a); //a,97
如果用戶在按回車鍵之前輸入了不只一個字符,其他字符會保留在鍵盤緩沖區中,等待后續系統調用讀取。也就是說,后續的系統調用不會等待用戶按鍵,而是直接讀取緩沖區中的字符,直到緩沖區的字符讀取完畢后,才等待用戶按鍵。
這段話怎么理解呢?我們用代碼來幫助理解。
下列代碼是這樣的:我們通過while循環從鍵盤中輸入一個字符,如果讀取到輸入的字符不是'k',就輸出它(需要按回車鍵),當輸入'k'時停止循環。那什么是保留到鍵盤緩沖區呢?我們知道getchar是一次讀取一個字符,需要按回車系統才會認為我們結束了本次輸入,當我們不按回車時系統就不會認為我們輸完了,在這個時候我們如果輸入abcdeg,系統會只調用一次getchar()讀取一個字符'a',并將'b'、'c'、'd'、'e'、'f'、'g'、'\n'依次放入到鍵盤緩沖區里,當我們按下回車,系統就會讀取a并輸出'a',然后不讓我們輸入了,轉去調用getchar()讀取緩沖區里的'b',再輸出'b',然后再調用getchar()讀取緩沖區里的'c',再輸出'c',直到調用getchar()讀取完并輸出完本次'a'、'b'、'c'、'd'、'e'、'f'、'g'、'\n'所有字符為止。輸出完后,由于并沒有碰到'k',所以系統會讓我們繼續輸入,我們輸入:hijklmn,按下回車,系統會依次調用getchar()讀取'h',輸出'h';調用getchar()讀取'i',輸出'i';調用getchar()讀取'j',輸出'j';調用getchar()讀取'k',此時系統發現輸入的字符等于'k',不滿足循環條件了,便會退出while循環而且不會輸出'k'。為什么會退出循環?是因為我們程序就是這樣設計的。因此這一次系統輸出的是:hij。當我們按下任意按鍵時,程序會退出。
#include
由于上段代碼中printf("%c",c);輸出的是一個字符,因此我們可以用putchar(c)替換掉它,效果與其一模一樣
#include
【運行結果】
abcdefg //輸入:abcdefg 回車 abcdefg //依次從鍵盤緩存區中讀取abcdefg和\n,并依次輸出:abcdefg和\n hijklmn //輸入:hijklmn 回車 hij //依次從鍵盤緩存區讀取hij,并依次輸出;讀取到k時退出循環 -------------------------------- Process exited after 6.641 seconds with return value 107 請按任意鍵繼續. . .
如果條件改為:
while( (c=getchar()) != '\a' )
那么'\a'是控制字符 - 響鈴,由于鍵盤上沒有這個鍵,所以我們無論輸入多少字符都不會結束程序的運行(除非手動點右上角的
×退出)。
冷知識:
可以這樣用嗎?
while( (printf("%c",getchar())) != '\n' ) ;
可以的,while里可以調用函數,此語句的意思是輸入字符并輸出,當讀取的字符不是\n時就一直循環,當讀取到'\n'時結束循環。但是由于我們不知道printf的返回值,所以暫時不要這樣用(printf的返回值暫時無需研究)
while( putchar(getchar()) );
可以的,不過同樣不知道putchar的返回值什么時候是0,所以成了死循環,不斷輸入字符、按下回車、調用getchar()讀取字符、調用putchar()輸出字符。
putchar()
頭文件:#include
函數與形參類型:?int putchar(int ch)
功能:輸出一個字符,可以是字符常量或字符變量
返回值:字符的ASCLL碼
1.輸出字符常量:
可以輸入整型或字符型,系統會將65、 0101 、0x41這三個不同進制的ASCII碼會轉化為字符型常量'A'。
putchar('A'); //A putchar(65); //A putchar(0101); //A putchar(0x41); //A
2.輸出字符變量:
char ch = 'A'; putchar(ch); //A int a = 65 ,b = 0101 , c = 0x41; putchar(a); //A putchar(b); //A putchar(c); //A
putchar()與getchar()混合使用:
為什么可以這樣用?因為getchar的返回值是輸入字符的ASCII碼值。
putchar()基本形式:輸入8,調用getchar()讀取'8',輸出'8'
int c = getchar(); //8 putchar(c); //8
上述寫法等價于下面寫法
這種寫法省去了定義c變量,可以直接輸入并輸出一個字符
putchar(getchar()); //1 printf("%c",getchar()); //2 與1等價
函數的實參可以是函數?這叫函數的嵌套調用嗎
輸入字符,鍵盤調用getchar()讀取一個字符,調用了4次,然后調用putchar()輸出1個字符,調用4次。
#include
【運行結果】
abcdefg //輸入 abcd //輸出
上述代碼等價于下面的代碼
#include
【運行結果】
123456789 //輸入 1234 //輸出
實例:
依次輸入兩個字符的值:5和6并換行輸出他倆
#include
【運行結果】
注意:這里的輸入和輸出,都是數字字符,本質是字符!!!
請輸入元素a的值:5 請輸入元素b的值:6 5 6
假設1:
如果在getchar輸入完a以后,不吸收回車,那么系統在輸出a之后,將不會讓我們輸入b,而是把回車 即'\n'賦值為b,再輸出b
#include
請輸入元素a的值:5 //輸入a:5 請輸入元素b的值:5 //系統將回車賦給b,再輸出a,(本行的5并不是我輸入的) //執行putchar('\n') 換行 //輸出b (此時的b是'\n') b元素的ASCII碼是:10 //執行putchar('\n') 換行,再輸出b的ASCII碼:10(對應'\n')
假設2:
如果將兩條putchar換行語句的單引號變為雙引號,就不是換行語句了,因為putchar只能輸出字符
putchar("\n"); //變為雙引號就不可以換行了
請輸入元素a的值:5 請輸入元素b的值:6 5$6$
控制臺
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。