解決C語言中使用scanf連續輸入兩個字元型別的問題
昨天用C程式設計,遇到一個關於scanf的細節問題,假如執行如下程式:
#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); }
表面上看這段程式是沒有錯的,也可以執行,但執行過程中到第二個scanf輸入值給ch2時,程式不會停止,而是直接執行到最後一個printf !
為什麼?當時百思不得其解。。。
今天上網查了下才知道,原來scanf是從標準輸入緩衝區中讀取輸入的資料,而%c的字元輸入格式會接收回車字元,在輸入第一個scanf時輸入字元後按 回車結束,輸入緩衝中儲存了這個回車符,遇到第二個scanf時,它自動把這個回車符賦給了ch2。
而如果第二個scanf的輸入格式不是%c時,由於格 式不匹配,這個回車符會被自動忽略,所以只有在連續輸入兩個%c的格式時才會出現這樣的問題!
解決辦法:(二辦法任選其一)
1。清空輸入緩衝區
第一個scanf後加入語句:
fflush(stdin); //C語言清空輸入緩衝區函式
2。格式控制中加入空格
將第二個scanf改為:
scanf(" %c",&ch2);//在%號前面加一個空格
scanf格式輸入時要求輸入格式與格式控制符中的完全一樣(如:scanf("abcd%c",&ch);輸入時必須輸入abcde,ch得到的值為e)空格可以抵消前面輸入的回車符。
補充知識:利用C語言實現:輸入兩個字串,統計一個字串在另一個字串中出現的次數。
輸入兩個字串,統計一個字串在另一個字串中出現的次數
例如,asdfgasfgasf,as,則輸出3
程式設計環境為codeblocks,編譯器是GUN-GCC,作業系統是win7-64位
分析:此程式碼主要運用了一個演算法,是字串匹配的樸素模式匹配演算法。看懂演算法之後再來讀程式碼就沒有什麼壓力了。
程式碼如下:
#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的下標,n為T的下標 m=0; n=0; int num=0;//num用於記錄選定單詞出現的次數 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("出現的次數是%d",num); } }
以上這篇解決C語言中使用scanf連續輸入兩個字元型別的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。