1. 程式人生 > 程式設計 >解決C語言中使用scanf連續輸入兩個字元型別的問題

解決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連續輸入兩個字元型別的問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。