cで3人分の国語と算数の点数を入力して、ファイルに出力するプログラムで、while文の中で、fgetsを2回使用しております。(全文は長過ぎたので抜粋します。)
while(i < 3 ) {
printf(&q uot;%d人目国語", i+1);
fgets(kokugo, sizeof(kokugo), stdin);
〜関数によるエラー処理〜
if(エラーなら) {
continue;
}
printf("%d人目算数", i+1);
fgets(sansu, sizeof(sansu), stdin);
〜関数によるエラー処理〜
if(エラーなら) {
continue;
}
i++;
以下略
}
エラーが出た場合(数以外など)は再度入力するように関数でしてるのですが
1人目国語 aaa
エラー!
1人目算数
というように次に進んでしまいます。
1人目国語 aaa
エラー!
1人目国語
というようにするにはどのようにすれば良いのでしょうか。
よろしくお願いします。
while. continue
Re: while. continue
そんなに長くなるようなプログラムでしょうか。hao さんが書きました:全文は長過ぎたので抜粋します。
少なくとも
エラー処理関数の中身とif文の具体的な内容は見せてほしいと思います。hao さんが書きました: 〜関数によるエラー処理〜
if(エラーなら) {
もしかすると、if文のエラー判定が逆だったりする可能性だってあるわけで。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: while. continue
ご返信ありがとうございます。
if文ですが、関数の中身でエラーフラグを立て(error=1)
mainの中でif(error==1)だったらcontinueといった感じにしております。
if文ですが、関数の中身でエラーフラグを立て(error=1)
mainの中でif(error==1)だったらcontinueといった感じにしております。
Re: while. continue
関数はこんな感じです。
mainの中で国語入力時はjudge=1で算数は2としてあります。
void Cheak_1(int judge, int error, char *listening, char *reading)
{
char tmp[5];
if (judge == 1) {
strcpy(tmp, kokugo);
} else {
strcpy(tmp, sansuu);
}
/* 空バッファ処理 */
if (tmp[strlen(tmp) - 1] != '\n'){
while (getchar() != '\n');
}
/* 改行がある場合削除 */
if (tmp[strlen(tmp) - 1] == '\n') {
tmp[strlen(tmp) - 1] = '\0';
}
/* 空Enterキー */
if (strlen(tmp) == 0) {
printf("空エンターが入力されました。再度入力してください\n");
error = 1;
}
/* 正の整数以外 */
if ('0' <= tmp[0] && tmp[0] <= '9') {
} else {
printf("正の整数以外が入力されました。再度入力してください\n");
error = 1;
}
/* 整数範囲確認 */
if (atoi(tmp) < 0 || atoi(tmp) > 100) {
printf("0~100までの整数を入力してください。\n");
error = 1;
}
}
mainの中で国語入力時はjudge=1で算数は2としてあります。
void Cheak_1(int judge, int error, char *listening, char *reading)
{
char tmp[5];
if (judge == 1) {
strcpy(tmp, kokugo);
} else {
strcpy(tmp, sansuu);
}
/* 空バッファ処理 */
if (tmp[strlen(tmp) - 1] != '\n'){
while (getchar() != '\n');
}
/* 改行がある場合削除 */
if (tmp[strlen(tmp) - 1] == '\n') {
tmp[strlen(tmp) - 1] = '\0';
}
/* 空Enterキー */
if (strlen(tmp) == 0) {
printf("空エンターが入力されました。再度入力してください\n");
error = 1;
}
/* 正の整数以外 */
if ('0' <= tmp[0] && tmp[0] <= '9') {
} else {
printf("正の整数以外が入力されました。再度入力してください\n");
error = 1;
}
/* 整数範囲確認 */
if (atoi(tmp) < 0 || atoi(tmp) > 100) {
printf("0~100までの整数を入力してください。\n");
error = 1;
}
}
Re: while. continue
もし、Cheak_1が本当にこのとおり(スペルがCheckになっていない点はさておき)なら、hao さんが書きました: void Cheak_1(int judge, int error, char *listening, char *reading)
error
を呼び出し側に返していないので、呼び出し側で
のようにすることはできません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。