解決C語言中使用scanf連續(xù)輸入兩個字符類型的問題
昨天用C編程,遇到一個關(guān)于scanf的細(xì)節(jié)問題,假如運(yùn)行如下程序:
#include<stdio.h> int main() { char ch1,ch2; printf("Input for ch1:/n"); scanf("%c",&ch1); printf("ch1=%c/n",ch1); printf("Input for ch2:/n"); scanf("%c",&ch2); printf("ch2=%c/n",ch2); }
表面上看這段程序是沒有錯的,也可以運(yùn)行,但運(yùn)行過程中到第二個scanf輸入值給ch2時,程序不會停止,而是直接運(yùn)行到最后一個printf !
為什么?當(dāng)時百思不得其解。。。
今天上網(wǎng)查了下才知道,原來scanf是從標(biāo)準(zhǔn)輸入緩沖區(qū)中讀取輸入的數(shù)據(jù),而%c的字符輸入格式會接收回車字符,在輸入第一個scanf時輸入字符后按 回車結(jié)束,輸入緩沖中保存了這個回車符,遇到第二個scanf時,它自動把這個回車符賦給了ch2。
而如果第二個scanf的輸入格式不是%c時,由于格 式不匹配,這個回車符會被自動忽略,所以只有在連續(xù)輸入兩個%c的格式時才會出現(xiàn)這樣的問題!
解決辦法:(二辦法任選其一)
1。清空輸入緩沖區(qū)
第一個scanf后加入語句:
fflush(stdin); //C語言清空輸入緩沖區(qū)函數(shù)
2。格式控制中加入空格
將第二個scanf改為:
scanf(" %c",&ch2);//在%號前面加一個空格
scanf格式輸入時要求輸入格式與格式控制符中的完全一樣(如:scanf("abcd%c",&ch);輸入時必須輸入abcde,ch得到的值為e)空格可以抵消前面輸入的回車符。
補(bǔ)充知識:利用C語言實現(xiàn):輸入兩個字符串,統(tǒng)計一個字符串在另一個字符串中出現(xiàn)的次數(shù)。
輸入兩個字符串,統(tǒng)計一個字符串在另一個字符串中出現(xiàn)的次數(shù)
例如,asdfgasfgasf,as,則輸出3
編程環(huán)境為codeblocks,編譯器是GUN-GCC,操作系統(tǒng)是win7-64位
分析:此代碼主要運(yùn)用了一個算法,是字符串匹配的樸素模式匹配算法??炊惴ㄖ笤賮碜x代碼就沒有什么壓力了。
代碼如下:
#include <stdio.h> #include <stdlib.h> int main() { char S[100],T[20]; char ch1,ch2; printf("請輸入主字符串:\n"); ch1=getchar(); int i=0; while(ch1!='\n') { S[i]=ch1; i++; ch1=getchar(); } printf("請輸入要篩選的字符串:\n"); ch2=getchar(); int j=0; while(ch2!='\n') { T[j]=ch2; j++; ch2=getchar(); } int m,n;//m為S的下標(biāo),n為T的下標(biāo) m=0; n=0; int num=0;//num用于記錄選定單詞出現(xiàn)的次數(shù) while(m<=i&&n<=j) { if(S[m]==T[n]) { m++; n++; } else { m=m-n+1; n=0; } if(n==j) { num++; } } if(m==i+1) { printf("出現(xiàn)的次數(shù)是%d",num); } }
以上這篇解決C語言中使用scanf連續(xù)輸入兩個字符類型的問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C++中菱形繼承和虛繼承的問題總結(jié)
C++的三大特性為:封裝,繼承,多態(tài)。但是在繼承中,存在一些使用方面的問題需要注意,下面這篇文章主要給大家總結(jié)介紹了關(guān)于C++中菱形繼承和虛繼承的問題,需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08C++中如何將operator==定義為類的成員函數(shù)
這篇文章主要介紹了C++中如何將operator==定義為類的成員函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01