下記のコードで適値以外の入力は再起させて数値の再入力を行いたいのですがうまくいきません
C言語
1calendar.h 2 3/* 関数プロトタイプ宣言 */ 4void read_year_month(int *y, int *m); /* 年と月の入力と入力された値の判定後に値を引数に代入 */ 5void d_days(int *ds, int y, int m); /* 日数の判定 */ 6void d_week_fday(int *w, int y, int m, int d); /* 月の初日の曜日を判定 */
C言語
1main.c 2 3#include <stdio.h> 4#include "calendar.h" 5 6int main(void) 7{ 8 int year, month, days, week_fday; 9 10 puts("年と月を入力後にその月のカレンダーを表示します"); 11 12 read_year_month(&year, &month); 13 14 printf("%d\n", year); 15 printf("%d\n", month); 16 getchar(); 17}
C言語
1read_year_month.c 2 3#include <stdio.h> 4 5#define STR_LEN 8 6 7void read_year_month(int *y, int *m) 8{ 9 char str[STR_LEN]; 10 int i; 11 12 fflush(stdin); /* 入力バッファのクリア */ 13 14 puts("年を2016〜2099の範囲、月を1〜12の範囲で入力して下さい"); 15 puts("年と月の間を半角スペースで区切って下さい"); 16 puts("例:2016 1/2099 12"); 17 printf("年と月の入力:"); 18 fgets(str, sizeof(str), stdin); 19 20 /* 数字以外の値が入力されたら再起 */ 21 for(i = 0; i < STR_LEN-1; i++) 22 { 23 if(i != 4) 24 { 25 if(str[i] < '0' && '9' < str[i]) 26 { 27 puts("入力された値は不正です"); 28 puts("入力し直して下さい"); 29 read_year_month(y, m); 30 } 31 else 32 { 33 /* NOP */ 34 } 35 } 36 else 37 { 38 /* NOP */ 39 } 40 } 41 sscanf(str, "%d %d", y, m); /* 文字型を整数型に変換して変数*y*mに代入 */ 42 /* 範囲外の数値が入力されたら再起 */ 43 if((*y < 2016 && 2099 < *y) || (*m < 1 && 12 < *m)) 44 { 45 puts("入力された値は不正です"); 46 puts("入力し直して下さい"); 47 read_year_month(y, m); 48 } 49 else 50 { 51 fflush(stdin); 52 } 53}
実行結果_1 年と月を入力後にその月のカレンダーを表示します 年を2016〜2099の範囲、月を1〜12の範囲で入力して下さい 年と月の間を半角スペースで区切って下さい 例:2016 1/2099 12 年と月の入力:abcdefghi 1408891440 32767
実行結果_2 年と月を入力後にその月のカレンダーを表示します 年を2016〜2099の範囲、月を1〜12の範囲で入力して下さい 年と月の間を半角スペースで区切って下さい 例:2016 1/2099 12 年と月の入力:1234 56 1234 56
2017/06/01 19:44 追記
皆様の意見を参考にしてread_year_month関数を下記のように修正したら再起がうまく機能するようになりました
C言語
1#include <stdio.h> 2#include <stdbool.h> 3#include "calendar.h" 4 5void read_year_month(int *y, int *m) 6{ 7 char str[STR_LEN]; 8 int i; 9 bool err_flg; 10 11 /* 入力バッファのクリア */ 12 fflush(stdin); 13 14 puts("年を2016~2099の範囲、月を1~12の範囲で入力して下さい"); 15 puts("年と月の間を半角スペースで区切って下さい"); 16 puts("例:2016 1/2099 12"); 17 printf("年と月の入力:"); 18 fgets(str, sizeof(str), stdin); 19 fflush(stdin); 20 21 /* 数字以外の値が入力された場合にエラー処理 */ 22 for (i = 0; i < STR_LEN-1; i++) 23 { 24 if (('0' < str[i] && str[i] < '9') || (str[i] == ' ' || str[i] == '\n')) 25 { 26 err_flg = false; 27 } 28 else 29 { 30 err_flg = true; 31 } 32 } 33 sscanf(str, "%d %d", y, m); /* 文字型を整数型に変換して変数y, mに値を代入 */ 34 /* 範囲外の値が入力されたらエラー処理 */ 35 if ((*y < 2016 || 2099 < *y) || (*m < 1 || 12 < *m)) 36 { 37 err_flg = true; 38 } 39 else 40 { 41 err_flg = false; 42 } 43 if (err_flg == true) 44 { 45 puts("入力された値は不正です"); 46 puts("入力し直して下さい"); 47 read_year_month(y, m); 48 } 49 else 50 { 51 /* NOP */ 52 } 53} 54
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/01 11:03
2017/06/01 11:56