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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

4712閲覧

配列を用いてひらがなや漢字を表示したい

4ma7g

総合スコア4

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2019/11/13 14:39

編集2022/01/12 10:55

前提・実現したいこと

ひらがなや漢字を表示したい

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

#include "DxLib.h" #include <stdio.h> char letter; int i = 0; int countchar = 0; char str[7] = "あいう"; //str[1] = 'a'; int loop = 1; int Green = GetColor(0, 255, 0); int x = 0, y = 0; int a,b; void mozi(void) { if (countchar >= 0) { ++countchar; } if (countchar == 50) { countchar = 0; ++i; //ループを止めるためのプログラム。 if (i == 6) { countchar = 11; } } if (i == 1) { a = i; } //printf("str[%d]は%c", i,str[i-1]); if (a == 1) { DrawFormatString(100+10, 500, Green, "%c", str[0]); } if (i == 2) { b = i; } //printf("str[%d]は%c", i,str[i-1]); if (b == 2) { DrawFormatString(100 + 20, 500, Green, "%c", str[1]); } } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { //ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定 int Font00, Font01; Font00 = CreateFontToHandle("メイリオ", 70, 3, DX_FONTTYPE_ANTIALIASING_EDGE);//"メイリオ" の30pt,太さ3のフォントを作成 Font01 = CreateFontToHandle("MS ゴシック", 50, 15, DX_FONTTYPE_NORMAL); //"MSゴシック"の50pt,太さ9のフォントを作成 SetFontSize(25); //サイズを64に変更 SetFontThickness(10); //太さを8に変更 ChangeFont("MS 明朝"); //種類をMS明朝に変更 ChangeFontType(DX_FONTTYPE_ANTIALIASING); //アンチエイリアスフォントに変更 SetGraphMode(780, 680, 32); // ウィンドウの大きさを指定 ChangeWindowMode(TRUE); // 全画面ではなくウインドウを使用 if (DxLib_Init() == -1) return -1; // DXライブラリ初期化処理 SetDrawScreen(DX_SCREEN_BACK); // 裏画面を使用する設定 // ウインドウのサイズを手動ではできず、且つウインドウのサイズに合わせて拡大もしないようにする SetWindowSizeChangeEnableFlag(FALSE, FALSE); // 画面サイズは最大の780*680にしておく SetGraphMode(780, 680, 32); // 最初は 640x480 にしておく SetWindowSize(780, 680); // while(裏画面を表画面に反映, メッセージ処理, 画面クリア) while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { //DrawFormatString(300, 300, Green, "座標[%d,%d]", x, y); // 文字を描画する DrawFormatString(300, 400, Green, "countcharは%d", countchar, Font00); // 文字を描画する DrawFormatString(10, 50, Green, "%d", i, Font00); DrawFormatString(20, 100, Green, "%d", a, Font00); DrawFormatString(100 + i * 10, 500, Green, "%s", str[i - 1], Font00); // 文字を描画する DrawFormatString(100 + i * 10, 500, Green, "%c", str[i - 1], Font01); // 文字を描画する mozi();//関数を置くことでiを含んだ描画の関数が働くようになる。 //ScreenFlip(); // 裏画面を表画面に反映 こいつが正しく動いていないせいで値が消えずに文字がずっと描画されていた。 } DxLib_End(); // DXライブラリ終了処理 return 0; }

試したこと

%cを%sとして見ましたが、ウィンドウが勝手に閉じるバグが起こりました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

配列の仕組み

まず簡単に配列についての説明をさせてください。
C++の配列では、配列変数の名前は「配列変数の先頭要素のアドレス」を示します。
一方str[0]のようにインデックス([]内の数字のことです)をつけたものが表すのはそのインデックスの要素そのものです。

わかりやすいようにアルファベットで説明しますが、

C++

1array[] = "abc";

と書くと、
array[0]は'a'一文字、
array[1]は'b'一文字、
array[2]は'c'一文字、
array[3]は'\0'(文字列の終わりを意味します)
をそれぞれ意味します。
ところで、このarray[0]からarray[4]までの変数はコンピュータのメモリ上に連続して存在します。だから、array[0]という変数がメモリ上のどこにあるかがわかれば順番に読み込んでいけばarray[4]までのすべての変数を読み込め、したがって”abc”という複数文字の文字列を読み込むことができます。
このarray[0]がメモリ上のどこにあるのかを表すのが配列変数の名前、つまりarrayなのです。

DrawFormatStringでひらがなを表示する方法

本題のひらがなを表示する方法ですが、DXライブラリのDrawFormatString関数について、リファレンス(下記URL)を確認すると以下のように宣言されています。(老婆心ながら質問する際にはDXライブラリを使っていることを明記しておくとわかりやすいかと思います。)

int DrawFormatString( int x , int y , unsigned int Color ,

              char *FormatString , ... ) ;

第四引数の char *FormatString という部分ですが、これは文字列のアドレス(メモリ上の場所のことをアドレスといいます)を要求しています。つまり単に「あいう」と表示したいだけならば
'''C++
char str[7] = "あいう";
DrawFormatString(0, 0, RED, str);
'''
これだけでいいのです。strという、配列変数の名前を第四引数に指定すればstr[0]から始まる文字列を読み込み表示してくれます。
また、「あいう」以外の文字も同時に表示したいときには書式付き文字列を使い、
'''C++
char str[7] = "あいう";
DrawFormatString(0, 0, RED, "%sを表示しました",str);
'''
とすればよいです。
%cは(通常)アルファベット一文字を表しますから、"%c"のようにしたときには後ろから指定するのはstr[0]のように配列の要素です。
一方、"%s"の場合は後ろには文字列を表す配列の先頭のアドレスを指定しなければならず、これはインデックスのついていない「str」とだけ書くことで実現できます。

4ma7gさんは

%cを%sとして見ましたが、ウィンドウが勝手に閉じるバグが起こりました。

とのことですが、これは%sがアドレスを要求しているにもかかわらず無理やりstr[0]という要素を指定してしまったために起こったエラーです。

参考

DXライブラリ リファレンス https://dxlib.xsrv.jp/function/dxfunc_graph2.html

投稿2019/11/13 19:53

Ryo99_1001

総合スコア25

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

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

0

C/C++ の場合、 charの配列は、バイト列を表します。

printf() (多分、DrawFormatString()も)の %c は、一文字と言いながら、実は 1バイトを出力。 そして、"あいう"などの日本語文字列は、文字数 ≠ バイト数です。
ここで、齟齬が発生します。C/C++ (C++の最新仕様は?) では、 %cで日本語が表示できないと考えください。%sで出力する事になります。既に指摘のあるように、%sに対応する引数は、文字"列" です。

まずは、この辺から、見直しましょう。

あと、コンパイラは何? とか、文字コードは何って事もあるのですが、その次でしょうか。

投稿2019/11/13 23:19

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問