Macにて柴田望洋著「新・明解C言語 中級編」でC言語をAtom・ターミナルGCCを使って練習していますが、第4章マスターマインド のList4-6で詰まってしまいました。初級編・中級編の第3章までは詰まってもネットでみたり、コードを少し変えたりしてすすめられましたが、ご教示いただければ幸いです。演習ではなく、本に載っているコードをそのまま走らせる部分です(118ページ List4-6)。
*本題に直接関係ないお説教などはご遠慮ください・・(前ありました)
発生している問題・エラーメッセージ
下記にのせるコードをMac・ターミナルで走らせたところ、エラーは出ないのですが、本来なら
■ マスターマインドをしましょう。
■ 四つの数字の並びを当ててください。
■ 同じ数字が複数含まれることはありません。
■ 4307のように連続して入力してください。
■ スペース文字などを入力してはいけません。
の後に「入力してください:」が出るはずですが、上記メッセージまでしか出ません。
黒い■のメッセージまでがでて、プログラムはそのまま走っているのですが、「入力してください」が出ず、数値をその状態でいれても何も起こらないので、CTRL+Cで強制終了させるしかない状態です。
「入力してください:」をどうやって表示すればよいかご教示ください。
** 該当のソースコード**
C
#include <time.h> #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> void make4digits(int x[]) { int i, j, val; for(i=0; i<4; i++){ do{ val = rand() % 10; for(j=0; j<1; j++) if(val==x[j]) break; }while(j<i); x[i] = val; } } int check(const char s[]){ int i, j; if(strlen(s) !=4) return 1; for(i=0; i<4; i++){ if(!isdigit(s[i])) return 2; for(j=0; j<i; j++) if(s[i]==s[j]) return 3; } return 0; } void judge(const char s[], const int no[], int *hit, int *blow){ int i, j; *hit = *blow = 0; for(i=0; i<4; i++){ for(j=0;j<4; j++){ if(s[i] == '0' + no[j]){ if(i == j) (*hit)++; else (*blow)++; } } } } void print_result(int snum, int spos){ if(spos == 4) printf("正解です!" ); else if(snum == 0) printf("それらの数字は全く含まれません。\n" ); else{ printf("それらの数字中%d個の数字が含まれます。\n", snum); if(spos == 0) printf("ただし位置もあっている数字はありません。\n" ); else printf("その中の%d個は位置もあっています。\n", spos); } putchar('\n'); } int main(void) { int try_no = 0; int chk; int hit; int blow; int no[4]; char buff[10]; clock_t start, end; srand(time(NULL)); puts("■ マスターマインドをしましょう。"); puts("■ 四つの数字の並びを当ててください。"); puts("■ 同じ数字が複数含まれることはありません。"); puts("■ 4307のように連続して入力してください。"); puts("■ スペース文字などを入力してはいけません。\n"); make4digits(no); start = clock(); do{ do{ printf("入力してください:" ); scanf("%s",buff); chk = check(buff); switch (chk) { case 1: puts("\aきちんと4文字で入力してください。"); break; case 2: puts("\a数字以外の文字を入力してください。"); break; case 3: puts("\a同一の数字を複数入植しないでください。"); break; } }while(chk != 0); try_no++; judge(buff,no, &hit, &blow); print_result(hit + blow, hit); }while(hit < 4); end = clock(); printf("%d回かかりました。\n所要時間は%.1f秒でした。\n", try_no, (double)(end-start)/CLOCKS_PER_SEC ); return 0; }
自分で調べたことや試したこと
初級編・中級編の第3章までは詰まってもネットでみたり、コードを少し変えたりしてすすめられました
使っているツールのバージョンなど補足情報
Mac OS Mojave 10.14.6
Terminal, Atomを使用
GCC 4.2.1
まだ回答がついていません
会員登録して回答してみよう