C言語でscanfを使って連続的に2つの文字タイプを入力する問題を解決します。
昨日はCでプログラミングして、scanfに関する細かい問題に出会いました。もし次のようなプログラムを実行したら、
なぜですか?当時は全く考えられなかった。
今日はネットで調べてみましたが、もともとはscanfは標準入力バッファから入力データを読み取り、%cの文字入力フォーマットはリターン文字を受信し、最初のscanfを入力した時に文字を入力した後にエコーを押して終了しました。入力バッファにはこのリターンコードが保存されています。第二のscanfに遭遇した時、自動的にこのリターンをch 2に付与しました。
第二のscanfの入力フォーマットが%cではない場合、フォーマットが合わないため、このリターンは自動的に無視されます。だから連続して2つの%cのフォーマットを入力する時だけこのような問題が発生します。
解決方法:(2つの方法のいずれかを選ぶ)
1です。入力バッファをクリア
最初のscanfの後に文を入れます。
fflush(stdin)//C言語クリア入力バッファ関数
2です。書式制御にスペースを入れる
二つ目のscanfを:
scanf("%c"、&ch 2)//%の前にスペースを入れる
scanfフォーマットの入力時に要求される入力フォーマットはフォーマット制御器と全く同じです。abcdeを入力する必要があります。chで得られた値はe)スペースです。前に入力したリターンを相殺できます。
補足知識:C言語を使って実現します。2つの文字列を入力して、他の文字列に1つの文字列が現れる回数を統計します。
二つの文字列を入力し、一つの文字列が別の文字列に現れる回数を統計します。
例えば、asdfgasfgasf、asは、3を出力します。
プログラミング環境はcodeblocksで、コンパイラはGUN-GCCで、オペレーティングシステムはwin-7-64ビットです。
解析:このコードは主にアルゴリズムを使っています。文字列マッチングのシンプルなパターンマッチングアルゴリズムです。アルゴリズムを読んでコードを読むとストレスがなくなります。
コードは以下の通りです
#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に値を入力してch 2を与えた時、プログラムは停止しません。最後のprintfまで直接実行します。なぜですか?当時は全く考えられなかった。
今日はネットで調べてみましたが、もともとはscanfは標準入力バッファから入力データを読み取り、%cの文字入力フォーマットはリターン文字を受信し、最初のscanfを入力した時に文字を入力した後にエコーを押して終了しました。入力バッファにはこのリターンコードが保存されています。第二のscanfに遭遇した時、自動的にこのリターンをch 2に付与しました。
第二のscanfの入力フォーマットが%cではない場合、フォーマットが合わないため、このリターンは自動的に無視されます。だから連続して2つの%cのフォーマットを入力する時だけこのような問題が発生します。
解決方法:(2つの方法のいずれかを選ぶ)
1です。入力バッファをクリア
最初のscanfの後に文を入れます。
fflush(stdin)//C言語クリア入力バッファ関数
2です。書式制御にスペースを入れる
二つ目のscanfを:
scanf("%c"、&ch 2)//%の前にスペースを入れる
scanfフォーマットの入力時に要求される入力フォーマットはフォーマット制御器と全く同じです。abcdeを入力する必要があります。chで得られた値はe)スペースです。前に入力したリターンを相殺できます。
補足知識:C言語を使って実現します。2つの文字列を入力して、他の文字列に1つの文字列が現れる回数を統計します。
二つの文字列を入力し、一つの文字列が別の文字列に現れる回数を統計します。
例えば、asdfgasfgasf、asは、3を出力します。
プログラミング環境はcodeblocksで、コンパイラはGUN-GCCで、オペレーティングシステムはwin-7-64ビットです。
解析:このコードは主にアルゴリズムを使っています。文字列マッチングのシンプルなパターンマッチングアルゴリズムです。アルゴリズムを読んでコードを読むとストレスがなくなります。
コードは以下の通りです
#include <stdio.h>
#include <stdlib.h>
int main()
{
char S[100],T[20];
char ch1,ch2;
printf(" :
");
ch1=getchar();
int i=0;
while(ch1!='
')
{
S[i]=ch1;
i++;
ch1=getchar();
}
printf(" :
");
ch2=getchar();
int j=0;
while(ch2!='
')
{
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を使って2つの文字のタイプを連続的に入力した問題は、小編集が皆さんに提供した内容の全てです。