C中kbhit()和getch()以及gets()和getchar()的用法
一、kbhit() 和 getch()
C語言中kbhit()函數(conio.h):檢查當前是否有鍵盤輸入,若有則返回一個非0值,否則返回0。
getch()函數,不需要回車就可以得到輸入的控制字符;
一般kbhit()和getch() 搭配使用!
1、應用舉例:
#include<stdio.h> #include<conio.h> int main() {int a;a = _kbhit();printf("%d\n",a);return 0; }運行結果:
?2、下面是一個實例,用戶每按一次任意按鍵,屏幕都會打印一句:"The user presses a key.",下面是程序源代碼:
#include<stdio.h> #include<conio.h> int main() {while (1) {if (_kbhit()) {printf("The user presses a key.\n");_getch();}}return 0; }運行結果:
3、用戶按任意鍵,退出程序:
#include <graphics.h> #include <stdlib.h> #include <conio.h> #include <time.h>void main() {srand((unsigned)time(NULL));initgraph(640, 480);int x, y, c;while (!kbhit()){x = rand() % 640;y = rand() % 480;c = RGB(rand() % 256, rand() % 256, rand() % 256);putpixel(x, y, c);//Sleep(10);}closegraph(); }?
?C_kbhit()和getch()函數的使用
結合一起使用:
char input; if (kbhit()) {input = getch();if (input == '1')…………搭配使用代碼:
#include <graphics.h> #include <stdio.h> #include <conio.h>void main() {char c = 0;while (c != 27){if (kbhit())c = getch();elsec = '.';printf("%c", c);Sleep(100);} }運行結果:
?
3、getch()和getche()區別:
相同點:兩個函數都不需要回車就可以得到輸入的控制字符;
不同點:getch()函數,輸入字符后,在屏幕上不顯示(不回顯);而getche()函數,輸入字符后,在屏幕上顯示(回顯)
運行代碼:
(1)、getch()
(2)、getche():
參考鏈接:getch(),getche(),getchar()的區別 (綜合轉)
二、gets()和getchar()
問題1:分析scanf()和getchar()讀取字符
1、scanf輸入:
輸入字符:q,然后回車
#include <stdio.h> int main() {char c1, c2;scanf("%c",&c1);scanf("%c",&c2);if (c2 == '\n'){c2 = 'a';}printf("c1=%c,c2=%c", c1, c2);return 0; }運行結果:
輸入字符:qw,然后回車?
2、getchar()輸入:
#include <stdio.h> int main() {char c1, c2;c1=getchar(); //輸入qwc2=getchar();if (c2 == '\n'){c2 = 'a';}printf("c1=%c,c2=%c", c1, c2);return 0; }運行結果:
運行結果:
【分析】:
??? 首先我們呢看一下輸入操作的原理, 程序的輸入都建有一個緩沖區,即輸入緩沖區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的數據存入輸入緩沖區,而cin函數直接從輸入緩沖區中 取數據。正因為cin函數是直接從緩沖區取數據的,所以有時候當緩沖區中有殘留數據時,cin函數會直接取得這些殘留數據而不會請求鍵盤輸入,這就是例子 中為什么會出現輸入語句失效的原因!
??? 因為scanf()和getchar()函數是從輸入流緩沖區中讀取值的,而并非從鍵盤(也就是終端)緩沖區讀取,而是讀取時遇到回車(\n)而結束的,這個\n會一起讀入輸入流緩沖區的,所以第一次接受輸入時取走字符后會留下字符\n,這樣第二次的讀入函數直接從緩沖區中 把\n取走了,顯然讀取成功了,所以不會再從終端讀取!這就是為什么這個程序只執行了一次輸入操作就結束的原因!
問題2:分析scanf()和gets()讀取字符串
?1、scanf()輸入:
#include <stdio.h> int main() {char c1[100], c2[100];scanf("%s",c1);scanf("%s",c2);printf("c1[]=%s\n",c1);printf("c2[]=%s\n",c2);return 0; }?運行結果:
?【分 析】到此程序執行完畢,不會執行第二次的讀取操作!這個問題的原因跟問題一類似,第一次輸入Hello world!后,字符串Hello world!都會被讀到輸入緩沖區中,而scanf()函數取數據是遇到回車、空格、TAB就會停止,也就是第一個scanf()會取出"Hello", 而"world!"還在緩沖區中,這樣第二個scanf會直接取出這些數據,而不會等待從終端輸入。
?
?【分析】程序執行了兩次從鍵盤讀入字符串,說明第一次輸入結束時的回車符被丟棄!即:scanf()讀取字符串會舍棄最后的回車符!
既:遇見空格 回車 TAB鍵,讀取停止,如果還有讀取控制,則對緩沖區剩余字符讀取!
2、gets()輸入:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() {char c1[100], c2[100];gets_s(c1);gets_s(c2);printf("c1=%s\n",c1);printf("c2=%s\n",c2);return 0; }運行結果
?【分析】顯然與上一個程序的執行情況不同,這次程序執行了兩次從鍵盤的讀入,而且第一個字符串取了Hello world! 接受了空格符,而沒有像上一個程序那樣分成了兩個字符串!所以如果要讀入一個帶空格符、Tab鍵的字符串時因該用gets(), 而不宜用scanf() !
問題3:getchar()暫停程序,查看程序執行結果:
不知道大家有沒有遇到過這樣的問題,有的編譯器程序執行完后的結果界面不會停下而是一閃就沒了,以至于看不到執行結果。所以很多人在程序最后加上 getchar()語句,目的是想讓程序執行完后停下來,等待從終端接收一個字符再結束程序。可是發現有時候這樣根本沒用,程序照樣跳出去了。這是為什么 呢?
【分析】原因跟上面例子講的一樣,是因為輸入緩沖區中還有數據,所以getchar()會讀到數據,所以就跳出了!
總結:
第一:要注意不同的函數是否接受空格符、是否舍棄最后的回車符的問題!
讀取字符時:
scanf()以Space、Enter、Tab結束一次輸入,不會舍棄最后的回車符(即回車符會殘留在緩沖區中);
getchar()以Enter結束輸入,也不會舍棄最后的回車符;
讀取字符串時:
scanf()以Space、Enter、Tab結束一次輸入
gets()以Enter結束輸入(空格不結束),接受空格,會舍棄最后的回車符!
第二:為了避免出現上述問題,必須要清空緩沖區的殘留數據,可以用以下的方法解決:
方法1:C語言里提供了函數清空緩沖區,只要在讀數據之前先清空緩沖區就沒問題了!
?????? 這個函數是fflush(stdin)。
方法2:自己取出緩沖區里的殘留數據。
(說實話這個語句我也沒看懂,呵呵!為什么格式控制是這樣的!希望高手指點一下!)
?????? scanf("%[^\n]",string);
gets()和getchar()的用法
總結
以上是生活随笔為你收集整理的C中kbhit()和getch()以及gets()和getchar()的用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5indexeddb排序,htm
- 下一篇: 电脑怎么修改html5,详细教你怎么设置