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

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

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

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

Q&A

解決済

2回答

690閲覧

ゲームの盤を表示させたいが、意図した表示にならない問題について

gyoruo

総合スコア61

C

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

0グッド

0クリップ

投稿2020/08/18 01:34

編集2020/08/18 01:35

以下のコード内のコメントのようなものを作りたいのですが、文字化けと、なぜか横ではなく縦に表示されてしまいます。
アドバイス等をお願い致します。
OSはmacOSでAtomで作業しており、コンパイラは最初から入っているものを使用しています。

C

1#include <stdio.h> 2 3// こんな盤を作りたい 4// 1 2 3 5// A * * * 6// B * * * 7// C * * * 8 9int main() { 10 unsigned short board[3][4][30] = { 11 {'A', "*", "*", "*"}, 12 {'B', "*", "*", "*"}, 13 {'C', "*", "*", "*"}}; 14 char y = '1'; 15 char i = 0; 16 char j = 0; 17 18 for (i = 0; i < 3; i++) { 19 printf(" %c ", y); 20 y++; 21 } 22 printf("\n\n"); 23 24 for (i = 0; i < 4; i++) { 25 for (j = 0; j < 4; j++) { 26 if (board[i][4]) { 27 printf("\n"); 28 } 29 printf("%c", board[i][j]); 30 } 31 } 32 33 return 0; 34} 35

イメージ説明

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

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

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

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

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

guest

回答2

0

ボードのデータについて、ひとマスごとを一文字だけとする場合、
char型でchar board[3][4]にして、各要素を全て' 'で囲みます。

ひとマスごとを、文字列にしたい場合は、
char型でchar board[3][4][30]にして、各要素を全て" "で囲みます。
そのうえ、出力時はprintfのフォーマット指定には"%s"を使います。

また、

C

1if (board[i][4]) { 2 printf("\n"); 3 }

だと、指定した行の次の行の頭が0以外の時に改行する。
になってしまっているので毎回改行してしまいます。
行末で改行したい場合は、文字を出力した後に
if(j==3)で改行するとかにすると、4文字目の後に改行を行うようになります。

投稿2020/08/18 02:24

amiya

総合スコア1218

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

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

DreamTheater

2020/08/18 02:41

そもそも if (board[i][4]) { はバッファー・オーバーランなので、amiyaさんご提示の if (j == 3) に変更すべきですね。
gyoruo

2020/08/18 04:27

ご回答ありがとうございます! 後々全角記号1文字を入れたいのですが、バイト数が2以上になってしまうため、やはり3次元配列でで行うしかないのでしょうか?
gyoruo

2020/08/18 04:37

また、配列の箱の個数を掛け算すると256を超えるのでshort型にしたのですが、単体で見て256を超えなければcharでも大丈夫ということでしょうか?
guest

0

ベストアンサー

こんにちは。

元コードについて

C

1 unsigned short board[3][4][30] = { 2 {'A', "*", "*", "*"}, 3 {'B', "*", "*", "*"}, 4 {'C', "*", "*", "*"}};

そもそも3次元目の30に深い意味がなさそうですし、shortで宣言する必要もありません。
将来的に全角文字を入れる予定ということであれば、2次元のポインタ配列にしてしまっては如何でしょうか?
というかコピペして気づきましたが元コードのアスタリスクが全角文字ですね。

c

1 char *board[3][4] = { 2 {"A", "*", "*", "*"}, 3 {"B", "*", "*", "*"}, 4 {"C", "*", "*", "*"}};

投稿2020/08/18 04:40

DreamTheater

総合スコア1095

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

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

gyoruo

2020/08/18 04:48

ご回答ありがとうございます! 2次元のポインタでできるかしてみますね! アスタリスクは全角で表示させたいのでそうしました。 あと、[30]はミスで、全角3バイトなのでA=1バイト+\0の2バイト+*=(全角3バイト+\n4バイト)*3の計[14]でした。{"A", "*", "*", "*"} 全角にしなければならない場合は配列の箱の数=バイト数なのでおかしくなると思ったので3次元でしてました。
DreamTheater

2020/08/18 05:01

gyoruoさん そもそも大きな勘違いをされているようです。 配列要素の合計と配列の型は無関係ですし、3次元目がー1時限目のサイズであるわけでもありません。 char *bouard[4] = {"A", "*", "*", "*"}; は、要素数が4のポインタ配列の各要素を文字列定数Aと*で初期化しています。 この配列を3セットにしたのが私が回答したコードです。 配列及びポインタについてもう少し勉強されることをお勧めします。
gyoruo

2020/08/18 05:08

ご回答ありがとうございます! 配列要素の合計と配列の型は無関係というご指摘でわかった気がします。。。 もう一度、ポインタと配列について勉強しなおします。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問