C言語でループ処理を行う際、特にfor文とwhile文を組み合わせて使用する場合、予期せぬ動作が発生することがあります。今回の質問では、for文が正しくループせず、特定の条件でエラーメッセージが表示される問題について解説します。この問題を解決するためのポイントを以下で説明します。
問題のコードとエラー
質問者が提供したコードでは、for文内にwhile文があり、ユーザーからの入力を受け取る処理が行われていますが、特定の条件でwhile文が正しく動作せず、1列目の表示後にループが止まってしまうという問題があります。
問題となっているコードは以下の通りです。
#include
int main()
{
int g,r;
int a[8];
g=0;
for(r=0;r<=7;r++)
{
while(g<1||g>8)
{
printf(“%d列目の数字を入力してください:”,r);
scanf(“%d”,&g);
}
a[r-1]=g;
}
return 0;
}
原因:変数gの初期値とwhile文の条件
問題の根本的な原因は、変数gの初期値が0に設定されている点です。while文の条件は「gが1以上8以下でない場合」に実行されるようになっていますが、最初にgが0であるため、while文は無限ループに入ってしまいます。
while文が無限ループに入ると、ユーザーからの入力が正しく処理されず、プログラムが停止してしまいます。このため、コードが意図した通りに動作しなくなります。
解決策:while文の条件の修正
この問題を解決するためには、while文の条件を適切に修正する必要があります。以下のように、gの初期値とwhile文の条件を見直すことで、正しく入力を受け付け、for文を正常にループさせることができます。
#include
int main()
{
int g,r;
int a[8];
g=0;
for(r=0;r<8;r++)
{
while(g<1||g>8)
{
printf(“%d列目の数字を入力してください:”,r+1);
scanf(“%d”,&g);
}
a[r]=g;
}
return 0;
}
この修正により、gが1以上8以下でない限り入力を促す処理が実行されるようになり、無限ループが解消されます。また、配列aに値を代入する際のインデックスもrに合わせて修正しています。
さらなる改善案:入力値のバリデーション
ユーザーからの入力値が正しい範囲にあることを確認するためには、より強力なバリデーションを加えることができます。例えば、入力値が数値であることを確認したり、範囲外の値が入力された場合に再度入力を促すなどの処理を追加すると、さらに堅牢なコードになります。
while(scanf(“%d”,&g) != 1 || g<1 || g>8)
{
printf(“入力が無効です。1から8の範囲で入力してください: “);
while(getchar() != ‘
’); // バッファのクリア
}
このように、scanfの戻り値を確認することで、非数値が入力された場合にも再入力を促すことができます。
まとめ
for文がループしない原因は、while文内の条件設定にあります。変数gの初期値が0であることにより、無限ループに入り、正常に処理が進まなくなります。この問題を解決するためには、while文の条件を適切に設定し、バリデーションを加えることで、より堅牢で正常に動作するプログラムを作成することができます。


コメント