getchar()和putchar()吸收回車問題

      網友投稿 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 void main( ){ int c; while( (c=getchar()) != 'k' ) //從控制臺流中讀取字符,直到按'k'結束 printf ("%c", c); //輸出讀取內容 }

      由于上段代碼中printf("%c",c);輸出的是一個字符,因此我們可以用putchar(c)替換掉它,效果與其一模一樣

      #include void main( ){ int c; while( (c=getchar()) != 'k' ) //從控制臺流中讀取字符,直到按'k'結束 putchar(c); // printf ("%c", c); //輸出讀取內容 }

      【運行結果】

      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 int main( ){ putchar(getchar()); putchar(getchar()); putchar(getchar()); putchar(getchar()); return 0; }

      getchar()和putchar()吸收回車問題

      【運行結果】

      abcdefg //輸入 abcd //輸出

      上述代碼等價于下面的代碼

      #include int main( ){ int i=4; while(i--) //循環4次 { putchar(getchar()); } return 0; }

      【運行結果】

      123456789 //輸入 1234 //輸出

      實例:

      依次輸入兩個字符的值:5和6并換行輸出他倆

      #include #include int main( ){ printf("請輸入元素a的值:"); int a = getchar() ; //輸入:5 回車 getchar(); //吸收掉回車 printf("請輸入元素b的值:"); int b = getchar(); //輸入:6 回車 putchar(a); //輸出a putchar('\n'); //換行 putchar(b); //輸出b putchar('\n'); //換行 return 0; }

      【運行結果】

      注意:這里的輸入和輸出,都是數字字符,本質是字符!!!

      請輸入元素a的值:5 請輸入元素b的值:6 5 6

      假設1:

      如果在getchar輸入完a以后,不吸收回車,那么系統在輸出a之后,將不會讓我們輸入b,而是把回車 即'\n'賦值為b,再輸出b

      #include #include int main( ){ printf("請輸入元素a的值:"); int a = getchar() ; //輸入:5 回車 // getchar(); //吸收掉回車 printf("請輸入元素b的值:"); int b = getchar(); //輸入:6 回車 putchar(a); //輸出a putchar('\n'); //換行 putchar(b); //輸出b putchar('\n'); //換行 printf("b元素的ASCII碼是:%d",b); return 0; }

      請輸入元素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小時內刪除侵權內容。

      上一篇:找不到路怎么辦,如何建立有效的項目管理體系
      下一篇:excel表格中怎么制作個性二維碼?
      相關文章
      亚洲一区二区三区在线| 亚洲国产成人五月综合网| 国产精品亚洲αv天堂无码| 日韩亚洲人成在线综合| 亚洲色在线无码国产精品不卡| 亚洲导航深夜福利| 亚洲美女激情视频| 亚洲欧洲日产韩国在线| 亚洲人成片在线观看| 亚洲六月丁香六月婷婷蜜芽| 亚洲乱码中文论理电影| 亚洲va在线va天堂成人| 国产成人亚洲综合网站不卡| 亚洲国产精品久久久久秋霞影院| 亚洲婷婷天堂在线综合| 亚洲午夜精品国产电影在线观看| 亚洲AV无码专区在线亚| 一区二区亚洲精品精华液| 亚洲av无码一区二区三区四区| 亚洲精品无码成人| 亚洲 无码 在线 专区| 亚洲一区二区三区在线播放| 精品久久久久久亚洲精品| 亚洲中文无码av永久| 亚洲国产视频一区| www.亚洲成在线| 亚洲欧美国产国产综合一区| 亚洲av午夜电影在线观看| 亚洲Aⅴ无码一区二区二三区软件| 亚洲国产精品碰碰| 日韩亚洲变态另类中文| 亚洲国产美女精品久久久久∴| 狠狠色伊人亚洲综合成人| 亚洲视频精品在线| 91嫩草亚洲精品| 亚洲暴爽av人人爽日日碰| 亚洲高清最新av网站| 亚洲精品午夜无码专区| 亚洲av日韩av天堂影片精品| 亚洲精品午夜久久久伊人| 亚洲中文无码亚洲人成影院|