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

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

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

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

Q&A

解決済

1回答

2228閲覧

実行すると変な文字が出てくる

kuroni

総合スコア4

C

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

0グッド

1クリップ

投稿2020/07/25 06:43

編集2020/07/25 06:51

40x40のライフゲームを作ったのですが
実行すると何行かに1回
[H
のような文字列が出てきてしまい綺麗な絵柄にならないので解決方法を教えてください

#include <stdlib.h> #define MAXT 100 #define M 40 #define N 40 #define DEAD (0) #define ALIVE (1) int cell[M+2][N+2] = {DEAD}; void init() { cell[15][N / 2] = ALIVE; cell[16][N / 2] = ALIVE; cell[17][N / 2] = ALIVE; cell[18][N / 2] = ALIVE; cell[19][N / 2] = ALIVE; cell[20][N / 2] = ALIVE; cell[21][N / 2] = ALIVE; cell[22][N / 2] = ALIVE; cell[23][N / 2] = ALIVE; cell[24][N / 2] = ALIVE; } void dump() { for (int y = 0; y < M; y++) { for (int x = 0; x < N; x++) { printf(cell[y][x] == DEAD ? "." : "@"); } printf("\n"); } } void update() { int next[M][N]; for (int y = 0; y < M; y++) { for (int x = 0; x < N; x++) { int count = 0; if (y > 0 && cell[y - 1][x] == ALIVE) count++; if (y < M - 1 && cell[y + 1][x] == ALIVE) count++; if (x > 0 && cell[y][x - 1] == ALIVE) count++; if (x < N - 1 && cell[y][x + 1] == ALIVE) count++; if (y > 0 && x > 0 && cell[y - 1][x - 1] == ALIVE) count++; if (y > 0 && x < N - 1 && cell[y - 1][x + 1] == ALIVE) count++; if (y < M - 1 && x > 0 && cell[y + 1][x - 1] == ALIVE) count++; if (y < M - 1 && x < N - 1 && cell[y + 1][x + 1] == ALIVE) count++; if (cell[y][x] == DEAD) { next[y][x] = count == 3 ? ALIVE : DEAD; } else { next[y][x] = count == 2 || count == 3 ? ALIVE : DEAD; } } } for (int y = 0; y < M; y++) { for (int x = 0; x < N; x++) { cell[y][x] = next[y][x]; } } } int main() { int t; system("clear"); init(); dump(); system("sleep 0.1s"); for (t = 1;t <= MAXT;t++) { update(); system("clear"); dump(); system("sleep 0.1s"); } return 0; }

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

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

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

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

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

Hyugopython

2020/07/25 06:46

どういうプログラムなのか具体的に書いていただくなくては、何とも言えません
kuroni

2020/07/25 06:49

すいません 40x40のライフゲームと言ったら伝わるでしょうか
Daregada

2020/07/25 07:03

こちらの質問で https://teratail.com/questions/280071 回答者に**大幅に手直し**して動くようにしてもらったプログラムですよね。そっちを解決済みにするほうが先なのでは?
kuroni

2020/07/25 07:09

申し訳ございません。このサイトを利用し始めてまだ日数が立っておらず、気分を害するような行為をしているとは思いませんでした。注意として、受け取るとともに、改善していこうと思います。
Daregada

2020/07/25 07:17

さて、表示されている文字は画面制御用のエスケープシーケンス(の一部)のように見えます。通常は画面制御に使われて画面には表示されない類の文字です。 こちらの環境では画面に表示されないので、あなたが使っているOSや端末アプリ、実行環境(仮想マシンかどうか)などを質問文に書き加える必要があります。
guest

回答1

0

ベストアンサー

[H

これは system("clear"); したときに出る、端末をクリアするためのエスケープシーケンスでしょう。
これが目に付くことはあんまりないはずですが、端末が文字を取りこぼすほどトロいか、
出力をlessなどに通したか、ファイルに落とした後それを表示させたか、といった状況でしょうか。
(手元のCygwinやVitrualBox上のCentOSでは、単に実行したときには目にしませんでした。)

でもって、それが「きれいな絵にならない」ような位置に出たということは、
プログラム中のバッファリングとsystem("clear");の出力が同期していないということでしょうから、
以下のように(system("clear");の実行前に)fflush()してしまえばよいでしょう。

C

1#include <stdio.h> // これを追加 2/* 中略 */ 3void dump() { 4 for (int y = 0; y < M; y++) { 5 for (int x = 0; x < N; x++) { 6 printf(cell[y][x] == DEAD ? "." : "@"); 7 } 8 printf("\n"); 9 } 10 fflush(stdout); // これも追加 11}

そちらの状況を再現できていないのでこれで解決するかどうかは定かではありませんが、
less を通した結果は改善されるようです。(盤面の途中には上記シーケンスが登場しなくなる)

投稿2020/07/25 07:33

e-watt

総合スコア84

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

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

kuroni

2020/07/25 08:32

解決しました ありがとうございます!
e-watt

2020/07/25 09:09

後学のために、どんな環境で起こった問題だったのかを教えてください。
kuroni

2020/07/27 12:51

すみません、勉強し始めたばかりで、どのように答えるのが適切かわからないのですが、c言語をLinuxで実行しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問