Macにて柴田望洋著「新・明解C言語 中級編」でC言語をAtom・ターミナルGCCを使って練習していますが、第4章マスターマインド のList4-6で詰まってしまいました。初級編・中級編の第3章までは詰まってもネットでみたり、コードを少し変えたりしてすすめられましたが、ご教示いただければ幸いです。演習ではなく、本に載っているコードをそのまま走らせる部分です(118ページ List4-6)。
*本題に直接関係ないお説教などはご遠慮ください・・(前ありました)
発生している問題・エラーメッセージ
下記にのせるコードをMac・ターミナルで走らせたところ、エラーは出ないのですが、本来なら
■ マスターマインドをしましょう。
■ 四つの数字の並びを当ててください。
■ 同じ数字が複数含まれることはありません。
■ 4307のように連続して入力してください。
■ スペース文字などを入力してはいけません。
の後に「入力してください:」が出るはずですが、上記メッセージまでしか出ません。
黒い■のメッセージまでがでて、プログラムはそのまま走っているのですが、「入力してください」が出ず、数値をその状態でいれても何も起こらないので、CTRL+Cで強制終了させるしかない状態です。
「入力してください:」をどうやって表示すればよいかご教示ください。
** 該当のソースコード**
C
1 2#include <time.h> 3#include <ctype.h> 4#include <stdio.h> 5#include <stdlib.h> 6#include <string.h> 7 8void make4digits(int x[]) 9{ 10 int i, j, val; 11 12 for(i=0; i<4; i++){ 13 do{ 14 val = rand() % 10; 15 for(j=0; j<1; j++) 16 if(val==x[j]) 17 break; 18 }while(j<i); 19 x[i] = val; 20 21 } 22} 23 24int check(const char s[]){ 25 int i, j; 26 27 if(strlen(s) !=4) 28 return 1; 29 30 for(i=0; i<4; i++){ 31 if(!isdigit(s[i])) 32 return 2; 33 for(j=0; j<i; j++) 34 if(s[i]==s[j]) 35 return 3; 36 } 37 return 0; 38} 39 40 41void judge(const char s[], const int no[], int *hit, int *blow){ 42 int i, j; 43 44 *hit = *blow = 0; 45 for(i=0; i<4; i++){ 46 for(j=0;j<4; j++){ 47 if(s[i] == '0' + no[j]){ 48 if(i == j) 49 (*hit)++; 50 else 51 (*blow)++; 52 } 53 54 55 56 57} 58} 59} 60 61 62void print_result(int snum, int spos){ 63 64 if(spos == 4) 65 printf("正解です!" ); 66 else if(snum == 0) 67 printf("それらの数字は全く含まれません。\n" ); 68 else{ 69 printf("それらの数字中%d個の数字が含まれます。\n", snum); 70 71 if(spos == 0) 72 printf("ただし位置もあっている数字はありません。\n" ); 73 else 74 printf("その中の%d個は位置もあっています。\n", spos); 75 76 77 } 78 putchar('\n'); 79 80} 81 82 83int main(void) 84{ 85 int try_no = 0; 86 int chk; 87 int hit; 88 int blow; 89 int no[4]; 90 char buff[10]; 91 clock_t start, end; 92 93 srand(time(NULL)); 94 95 puts("■ マスターマインドをしましょう。"); 96 puts("■ 四つの数字の並びを当ててください。"); 97 puts("■ 同じ数字が複数含まれることはありません。"); 98 puts("■ 4307のように連続して入力してください。"); 99 puts("■ スペース文字などを入力してはいけません。\n"); 100 101 make4digits(no); 102 103 start = clock(); 104 105 do{ 106 do{ 107 printf("入力してください:" ); 108 scanf("%s",buff); 109 110 chk = check(buff); 111 112 switch (chk) { 113 case 1: puts("\aきちんと4文字で入力してください。"); break; 114 case 2: puts("\a数字以外の文字を入力してください。"); break; 115 case 3: puts("\a同一の数字を複数入植しないでください。"); break; 116 117 } 118 }while(chk != 0); 119 120 try_no++; 121 judge(buff,no, &hit, &blow); 122 print_result(hit + blow, hit); 123 }while(hit < 4); 124 125 end = clock(); 126 127 printf("%d回かかりました。\n所要時間は%.1f秒でした。\n", try_no, (double)(end-start)/CLOCKS_PER_SEC ); 128 129 return 0; 130 131 132 133}
自分で調べたことや試したこと
初級編・中級編の第3章までは詰まってもネットでみたり、コードを少し変えたりしてすすめられました
使っているツールのバージョンなど補足情報
Mac OS Mojave 10.14.6
Terminal, Atomを使用
GCC 4.2.1
回答2件
あなたの回答
tips
プレビュー