質問するログイン新規登録
C

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

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。

Q&A

解決済

2回答

713閲覧

C言語の将棋のプログラムについて、飛車、角行を動かすと、文字列のエラーになる。

todasan

総合スコア94

C

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

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。

0グッド

1クリップ

投稿2025/10/09 09:24

編集2025/10/10 11:06

0

1

実現したいこと

C言語とmingw64とpdcursesにより、将棋のゲームを作成しています。
以下のソースで実行していますが、飛車と角をカーソルによりエンターを押すと、
以下の画像のようなエラーが出ます。何か解決方法が分かればお聞きしても
よろしいですか。他の歩や金などは、問題なく動作しています。

・Makefile
https://www.mycompiler.io/view/Ag90sG2vfY2
・shougi_data.h
https://www.mycompiler.io/view/16sqlXezD9w
・shougi_main.c
https://www.mycompiler.io/view/3wfcsxSvq8n
・shougi_input.c
https://www.mycompiler.io/view/7ZSQIgfPioK
・shougi_boad.c
https://www.mycompiler.io/view/1zU9qcw3ZLs
・shougi_highlight.c
https://www.mycompiler.io/view/Dg5hSIiseuP

イメージ説明

イメージ説明

発生している問題・分からないこと

質問に詳細を記載した。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

質問に詳細を記載した。

補足

特になし

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

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

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

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

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

little_street

2025/10/09 10:54 編集

少し試してみたところ,ハイライトしようとするマスが上3行のマスを含むとエラーになるようです。従って,動きが大きい「飛車」や「角」はいきなりエラーになりましたが,他の駒でも上に移動してその状況を作ればエラーになります。
jimbe

2025/10/09 11:12

エラーが以前のものと同じではないでしょうか。 つまり文字の表示に関してのものと推測します。 上3行は v が付いていて下3行と異なりますので、例えば一旦 v を無くしてみるとかで試しては如何でしょうか。
little_street

2025/10/09 14:26

jimbe さんのコメントを基に確かめてみました。 初期の配置では「桂馬」で確かめるしかありませんが、「上3行のマス」ではなく「後手のコマのあるマス」をハイライトしようとするとエラーになります。
jimbe

2025/10/09 17:07

恐らく、 v歩 と半角3文字分の表示をしている所をスペースで前半角2文字分を変更することで 歩 の右半分が残って問題になっているのでは。
little_street

2025/10/10 03:41 編集

確かに,「v歩」の一部を「歩」や「歩v」に変更して,そのマスで確かめてみるとエラーになりません。 恐らく以前の問題も,書き込んだ文字が半角として扱われ(空マスの)全角スペースの上に書き込んだために生じたのでしょう。以前の回答にもその旨を追記しておきます(原因究明が中途半端でした)。 なお,本件については後手の駒を全て「歩v」(v を後ろにする)等に書き換えることで改善できることを確認しました。
guest

回答2

0

既に解決済みですが、対処方法が分かりましたので参考までに回答として投稿しておきます。

移動可能なマスをハイライトする処理がありますが、全角スペース(U+3000)で上書きする前にコマの表示領域をスペース文字(U+0020)で上書きします。また、前回の質問の様に"□"(U+25A1:WHITE SQUARE)で上書きしても問題ありません。

shougi_highlight.c

c

1 // スペース文字(U+0020)でマス内の表示領域をクリア 2 mvprintw(ORIGIN_Y + ny * CELL_H, ORIGIN_X + nx * CELL_W, "%*s", CELL_W - 2, " "); 3 // ここでハイライト表示(PDCursesなら背景色変更) 4 attron(COLOR_PAIR(4)); 5 mvaddstr(ORIGIN_Y + ny * CELL_H, ORIGIN_X + nx * CELL_W, " "); 6 //mvaddstr(ORIGIN_Y + ny * CELL_H, ORIGIN_X + nx * CELL_W, "□"); 7 attroff(COLOR_PAIR(4));

イメージ説明
以下は初期盤面データとソースコードです。

shougi_banmen.csv

v香,v桂,v銀,v金,v王,v金,v銀,v桂,v香, ,v飛,,,,,,v角,, v歩,v歩,v歩,v歩,v歩,v歩,v歩,v歩,v歩, ,,,,,,,,, ,,,,,,,,, ,,,,,,,,, 歩,歩,歩,歩,歩,歩,歩,歩,歩, ,角,,,,,,飛,, 香,桂,銀,金,王,金,銀,桂,香,

shougi_boad.c
shougi_data.h
shougi_highlight.c
shougi_input.c
shougi_main.c

投稿2025/10/12 04:58

編集2025/10/12 05:34
melian

総合スコア21501

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

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

todasan

2025/10/13 02:51

melian さん ありがとうございます。こちらの方が見栄えがいいので、こちらの書き方にしようと思います。
guest

0

自己解決

駒は先歩、後歩として、駒を消すときは全角のスペースを2つにしました。移動範囲の
表示もできて、エラーも発生はしなくなりました。質問欄のソースコードに、
直した内容は載せました。

投稿2025/10/10 11:09

編集2025/10/10 11:10
todasan

総合スコア94

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

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

melian

2025/10/10 12:19 編集

※ 間違いのため削除
jimbe

2025/10/10 15:56

以前「文字コードが utf-8 でも s_jis でも動くように」と言われていた気がしますが、それは止めて utf-8 のみにされたのでしょうか。
todasan

2025/10/11 01:22

jimbe さん s_jisでソースファイルを変換しましたが、エラーは消えませんでした。元々、ソースファイルの 形式は utf-8をよく使われるイメージですので、 utf-8にしました。
jimbe

2025/10/11 04:32 編集

件の場合、クリアによって漢字の一部が残るという状況は utf-8 でも s_jis でも変わりませんので、エラーは消えません。(原因を特定出来ていない状態で勘で変更して直ることを期待するのは、良い方法ではありません。) 表示を全て全角にしてクリアもきちんと(一部が残らないように)調整されたのであれば utf-8 でも s_jis でもエラーは無くなるはずですが、チラと修正後のコードを見た所、全角2文字の後ろの文字のアドレスを得るために +3 をしている箇所があり、これは utf-8 の一部の文字にしてしか対応しません。(s_jis では +2 でしょうし、 utf-8 の"1文字"は合わせ文字も含めると何バイトになるか分かりません。) つまり事実上『駒の表示に関しては最初の全角文字が3バイト文字専用』のコードになり、もし"先"/"後"を他の文字に変える場合はそれが3バイト文字であることを確認しておかないと誤動作する可能性のあるコードになったことは、認識されているでしょうか。
todasan

2025/10/11 14:38

jimbe さん utf8の全角の2文字で、6バイト、全角のスペースで6バイトなので、今のところエラーにはなっていないです。駒が成った場合に、6バイトかは分かりません。 おそらく2文字で、6バイトの文字なら、問題はない気がします。
jimbe

2025/10/12 18:11 編集

>おそらく2文字で、6バイトの文字なら、問題はない気がします 心配していますのは今後です。 これまで先攻後攻を示すのに先後→v→先後と2度変えたことになりますが、今後また変えたときに本件のことを忘れていたらまた時間が掛かるのでは…ということです。 このような時『忘れなければ大丈夫』とせず忘れても大丈夫な様に仕込んでおくことも1つの経験則かと思います。 例えば、駒の文字列の2文字目、ではなく最後の文字が"歩"(や他の駒の文字)という判断にすれば、文字列の先頭アドレスに 3 を足すのではなく、文字列の最後のアドレスから"歩"の長さを引いたアドレスから"歩"と比較する、というふうにすることで utf-8 でも s_jis でも、"前"/"後"が何バイトになっても大丈夫なのではないでしょうか。 //pname = piece + 3; //if (strcmp(pname, "歩") == 0) { if(strcmp(piece+strlen(piece)-strlen("歩"), "歩") == 0) { // 歩の処理 } ・・・ 上記のコードなら piece が "後歩" でも "v歩"、"歩" でも "3" というマジックナンバー ( https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0) ) を使わずに判断できるでしょう。 そしてこのような判断が幾つもあるようなら「文字列の始まりや終わりが指定した文字列か」という関数を作ることになるでしょう。 /* 文字列 s の始まりが t と一致する場合 0、一致しない場合 0以外 を返す */ int strfcmp(const char *s, const char *t) { return strncmp(s, t, strlen(t)); } /* 文字列 s の終わりが t と一致する場合 0、一致しない場合 0以外 を返す */ int strlcmp(const char *s, const char *t) { int sl = strlen(s); int tl = strlen(t); return sl<tl ? -1 : strcmp(s+sl-tl,t); } piece から"後"かを判断するなら strfcmp(piece, "後") 、 piece から"歩"かを判断するなら strlcmp(piece, "歩") で済むようになり、従って先の if 文も //pname = piece + 3; //if (strcmp(pname, "歩") == 0) { if(strlcmp(piece, "歩") == 0) { // 歩の処理 } ・・・ とほぼ元の if のように書けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問