マンゴーiOS開発の2つのscanf運転時に最初の実行が終了しました
今日はscanfを使う過程で問題に遭遇しました.2つのコードにはscanf関数がありますが、最初のscanfはコンソールでパラメータを入力した後、2番目のscanfは入力を提示せずに直接実行しました.まず問題コードを見てみましょう.図のように.
実行結果を見てください.
2段目のプログラムの実行時に文字を入力するのを待っていないうちに、プログラムの実行は終わりました.
上の2つのコードは簡単に見えますが、中には普段は遭遇しにくい問題が隠されています.ゴミ文字です.すなわち,プログラム1が実行される場合,コンソールに文字letterを入力する必要がある.文字を入力した後、次の車を押してプログラムを続行します.このとき、リターン記号はキャッシュに格納され、プログラム2を実行する際に文字genderを入力する必要がある場合、システムはリターン記号をgenderに付与するので、プログラム2は文字の入力を指示せずに早期に終了する.
解決方法:
プログラム1とプログラム2の間にgetchar()を追加する.方法でいいです.次はgetchar();の役割:1.バッファ2をクリアすることに相当する1文字をバッファから読み出す.前のscanf()は、読み込み入力時にバッファに1文字を残すので、ここにgetchar()を付けてこのリターン記号を取らないと、上の問題が発生して2番目のscanfがバッファのリターン記号を取り出し、読み取りに誤りが発生します.
<span style="font-size:24px;">// 1
printf("
");
char letter;
scanf("%c", &letter);
if (letter == 'm') {
printf("
");
}
// 2
printf("
");
char gender;
scanf("%c", &gender);
if (gender == 'm') {
printf("
");
} else {
printf("
");
}</span>
実行結果を見てください.
2段目のプログラムの実行時に文字を入力するのを待っていないうちに、プログラムの実行は終わりました.
上の2つのコードは簡単に見えますが、中には普段は遭遇しにくい問題が隠されています.ゴミ文字です.すなわち,プログラム1が実行される場合,コンソールに文字letterを入力する必要がある.文字を入力した後、次の車を押してプログラムを続行します.このとき、リターン記号はキャッシュに格納され、プログラム2を実行する際に文字genderを入力する必要がある場合、システムはリターン記号をgenderに付与するので、プログラム2は文字の入力を指示せずに早期に終了する.
解決方法:
プログラム1とプログラム2の間にgetchar()を追加する.方法でいいです.次はgetchar();の役割:1.バッファ2をクリアすることに相当する1文字をバッファから読み出す.前のscanf()は、読み込み入力時にバッファに1文字を残すので、ここにgetchar()を付けてこのリターン記号を取らないと、上の問題が発生して2番目のscanfがバッファのリターン記号を取り出し、読み取りに誤りが発生します.