http://baike.baidu.com/link?url=prP2Bsl6Hx8IdaSt_oEyHEAh5F0yhBv458fKZK9PMXB6IK7-N5vdMp4nLR38-I_n
在C primer plus編程題上看到一道題:
編寫一個程序。該程序讀取輸入直到遇到#字符,然後報告讀取的空格數目、讀取的換行符數目以及讀
取的所有其他字符數目。
答案:
#include<stdio.h>
int main(void)
{
int space=0,newline=0,others=0;
char a;
printf("Please input a string end by #:");
while((a=getchar()) != '#')
if(a == ' ') space++;
else if (a == '\n') newline++;
else others++;
printf("space: %d,newline: %d,others: %d\n",space,newline,others);
return(0);
}
程序優點:輸入字符可見。
程序缺陷:輸入#後,程序沒有停止,必須先回車。。
其中使用getchar()讀取輸入的字符;
getchar()和getch()的區別:
getchar有一個int型的返回值.當程序調用getchar時.程序就等着用戶按鍵.用戶輸入的字符被存放在鍵盤緩衝區中.直到用戶按回車爲止(回車字符也放在緩衝區中).當用戶鍵入回車之後,getchar纔開始從stdio流中每次讀入一個字符.getchar函數的返回值是用戶輸入的第一個字符的ASCII碼,如出錯返回-1,且將用戶輸入的字符回顯到屏幕.如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待後續getchar調用讀取.也就是說,後續的getchar調用不會等待用戶按鍵,而直接讀取緩衝區中的字符,直到緩衝區中的字符讀完爲後,纔等待用戶按鍵.
getch與getchar基本功能相同,差別是getch直接從鍵盤獲取鍵值,不等待用戶按回車,只要用戶按一個鍵,getch就立刻返回, getch返回值是用戶輸入的ASCII碼,出錯返回-1.輸入的字符不會回顯在屏幕上.getch函數常用於程序調試中,在調試時,在關鍵位置顯示有關的結果以待查看,然後用getch函數暫停程序運行,當按任意鍵後程序繼續運行.
用getch();會等待你按下任意鍵,再繼續執行下面的語句;
用ch=getch();會等待你按下任意鍵之後,把該鍵字符所對應的ASCII碼賦給ch,再執行下面的語句。
易錯點
1.所在頭文件是conio.h。而不是stdio.h。
2.在使用之前要調用initscr(),結束時要調用endwin()。否則會出現不輸入字符這個函數
也會返回的情況。
3.在不同平臺,輸入回車,getch()將返回不同數值,而getchar()統一返回10(即\n)
1)windows平臺下ENTER鍵會產生兩個轉義字符 \r\n,因此getch返回13(\r)。
2)unix、 linux系統中ENTER鍵只產生 \n ,因此getch返回10(\n)。
3)MAC OS中ENTER鍵將產生 \r ,因此getch返回13(\r)。
getch()並非標準C中的函數,不存在C語言中。所以在使用的時候要注意程序的可移植性。國內C語言新手常常使用getch()來暫停程序且不知道此函數來源,建議使用getchar();(如果情況允許)代替此功能或更換一款編譯器。
故此,使用getch()這道題:
#include<conio.h>
int main()
{
int space=0,newline=0,other=0;
char a;
printf("Please input a string end by #:");
while((a=getch())!='#')
if(a==' ') space++;
else if(a=='\r') newline++;
else other++;
printf("space:%d,newline:%d,other:%d\n",space,newline,other);
return 0;
}
程序優點:輸入#,程序就停止了。