新聞中心
C語言里面如何兩次用scanf函數(shù)獲取鍵盤輸入的字符
scanf接收字符時的格式是scanf("%c",ch)(ch是定義過的接收鍵盤輸入字符的變量,下同);。這種格式下,無論輸入緩沖區(qū)里有多少字符,scanf("%c",ch);都只接收最前面的一個賦給ch,但系統(tǒng)要以'\n'作為輸入結(jié)束的命令,那么scanf("%c",ch);在接收一個輸入字符時必然會把'\n'遺留在緩沖區(qū)里。
晉寧網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設就選創(chuàng)新互聯(lián)。
這樣問題就來了,由于'\n'也是一個字符,所以下一個scanf("%c",ch2);就會把上一個scanf("%c",ch);遺留在緩沖區(qū)里的'\n'接收并賦給ch2,這就造成第二個scanf("%c",ch2);失去了從鍵盤接收用戶輸入的字符的機會(scanf("%c",ch2)只接收一個字符),從而造成代碼運行出錯。
解決辦法很多,在scanf("%c",ch);語句前加getchar();,加fflush(stdin);,甚至把scanf("%c",ch);寫兩遍都能湊效。但這不僅要消費空間時間,而且閱讀也不直觀。其實知道了原理解決起來就方便了,最簡單的辦法是把每一個類似scanf("%c",ch);這樣讀字符的語句改寫成scanf(" %c",ch)(%前有個空格);就可以了,原理是這個空格會命令scanf跳過所有的廣義空格(' '、'\t'、'\n'等)再接收字符——當然沒有空格就不會有跳過動作——問題就迎刃而解了。
下面提供驗證代碼:
//#include?"stdafx.h"http://If?the?vc++6.0,?with?this?line.
#include?"stdio.h"
int?main(void){
char?a,b;
scanf("?%c",a);
scanf("?%c",b);
printf("%c?%c\n",a,b);
return?0;
}
C語言中的鍵盤輸入函數(shù)。。。
k=k0xff?0x00ff:k8;其實就是
if(k0xff) {
k=0x00ff;
}else {
k=k8;
}的簡寫。
其實0xff和0x00ff是一樣的,都表示同一個十六進制的值。
書上這么寫,沒有錯;至于為什么,就不好說了。
可能是讓你多學點知識,也可能是現(xiàn)在很多書其實在編寫時并不是很認真的。畢竟盡信書不如無書!
后面的k8是把0xff的值右移8位,達到計算的目的(具體什么目的要看具體內(nèi)容)
在C語言中通常使用 什么函數(shù)獲得用戶從鍵盤上的輸入
scanf函數(shù)
scanf("%d",a); 輸入一個整數(shù)賦值給a;
scanf("%f",a); 輸入一個浮點數(shù)賦值給a;
scanf("%c",a); 輸入一個字符賦值給a;
scanf("%s",%a); 輸入一個字符串賦值給a;
分享文章:mysql怎么創(chuàng)建序列,mysql 序列化
網(wǎng)站地址:http://ef60e0e.cn/article/hoddig.html