質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

2回答

667閲覧

「新・明解C言語 中級編」マスターマインド List4-6で入力文が出ない

MakoGuwa71

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2022/01/14 03:09

編集2022/01/15 11:22

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/01/14 03:13

> 上記メッセージまでしか出ません。 「そこでプログラムが終了してしまう」、あるいは「メッセージは出ないけれど入力待ちになっていて、入力すれば一応進む」、「入力を受け付けないけれど終了もしない」など、どのような状態なのでしょうか?
y_waiwai

2022/01/14 03:40

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
MakoGuwa71

2022/01/14 06:11

maisumakun  様:黒い■のメッセージまでがでて、プログラムはそのまま走っているのですが、「入力してください」が出ず、数値をその状態でいれても何も起こらないので、CTRL+Cで強制終了させるしかない状態です。 y_waiwai様:ご指摘の通り修正いたしました。また文頭も読みにくかったので書き直しました。よろしくお願いいたします。
otn

2022/01/14 16:08

これは自分で打ち込んだのですか?出版社のサポートサイトからダウンロードした物ですか? 手で打ち込んだのであれば、まず間違いなくタイプミスですです。 と思ったら、回答にありますね。1とiのタイプミスです。
MakoGuwa71

2022/01/15 02:21

otn様:ありがとうございました。無事動くようになりました。様々な考えはありますがシンプルに「〜行のタイプミスですよ」と言って欲しかったです・・
guest

回答2

0

自己解決

単純なiと1のタイプミスでした。皆さまありがとうございました。

投稿2022/01/15 02:22

MakoGuwa71

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

関数make4digitsの中で、}while(j<i); の前に
printf("j = %d, i = %d\n", j, i);
入れてみてください。

追記
1行ずつ、その行が何をしているのかを考えないのですか?
変数の値の変化を追跡してみないのですか?

diff

1- for(j=0; j<1; j++) 2+ for(j=0; j<i; j++)

投稿2022/01/14 06:21

編集2022/01/14 14:00
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MakoGuwa71

2022/01/14 06:30

kazuma-s様:ご回答ありがとうございます。ご指摘の通りにしてみましたが、下記の表示が無限に出てくるようになりました・・ j = 0, i = 2 j = 1, i = 2 j = 1, i = 2 j = 1, i = 2 j = 1, i = 2 j = 1, i = 2 j = 1, i = 2
MakoGuwa71

2022/01/15 02:19

kazuma-s様: otn様のコメントでタイプミスとわかりました。ご教示しようとしていただいたのはありがたいですが、私はそういう遠回しな教師っぽいやり方で言われるのが嫌で「お説教不要」と書いたのですが・・「〜行の入力ミスです」と言っていただければベストアンサーを差し上げたのですが。しかしながらありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問