構造体に入れた文字列の表示ができません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
化猫
記事: 15
登録日時: 9年前

構造体に入れた文字列の表示ができません。

#1

投稿記事 by 化猫 » 8年前

現在DXライブラリを使用しゲームを作っていまして、分からないところがあります。

コード:

typedef struct
{
	int money;
	int life;
	char player_name[20];
}
ch_t;

GLOBAL ch_t ch;
と構造体を作り初期化をする部分で

コード:

ch.money = 0;
ch.life = 3;
ch.player_name = "あいうえお";
このように初期化しようとすると、moneyとlifeは問題ないのですが、player_nameは書き方が違うようでエラーになってしまいます。

コード:

ch_t ch = { 0, 3, "あいうえお"};
このように違う書き方をすれば、初期化自体は問題ないのですが、player_nameを表示する際に名前が出てきません。

名前を表示する時の書き方が間違っているかもしれないので、書いておきます。

コード:

DrawFormatStringToHandle( 0 , 0 , color[0] , font[0] , "%s" , ch.player_name );
質問したいこと
1.どのように書けば文字列を表示することができるのでしょうか?
2.何故初期化の書き方を変えると動くのでしょうか?(自分では、どっちで書いても同じだと思っています。書き方の間違いを指摘して下さい。)

この他の部分は正常に動作しているので、問題はないと思い、部分的に記述しました。
宜しくお願い致します。
最後に編集したユーザー 化猫 on 2011年12月11日(日) 20:13 [ 編集 1 回目 ]

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: 構造体に入れた文字列の表示ができません。

#2

投稿記事 by beatle » 8年前

質問1に関しては、僕はDXライブラリに詳しくないので分かりません。

質問2に関してお答えします。
char配列に文字列リテラル("hoge"などという文字列)を代入することはできません。
ただし、文字列リテラルで初期化することはできます。
つまり

コード:

char s[32] = "hoge"; // OK

コード:

char s[32];
s = "hoge"; // ERROR
ということです。
初期化以外の場合にchar配列に文字列リテラルをコピーするにはstrcpy関数を使います。

non
記事: 1097
登録日時: 9年前

Re: 構造体に入れた文字列の表示ができません。

#3

投稿記事 by non » 8年前

質問1はカラーやフォントハンドルをどう作っているかわからないと答えられません。
non

化猫
記事: 15
登録日時: 9年前

Re: 構造体に入れた文字列の表示ができません。

#4

投稿記事 by 化猫 » 8年前

回答ありがとうございます。

カラー、フォントハンドルは以下のようになっています。

コード:

color[0] = GetColor(255,255,255); //白
font[0] = CreateFontToHandle( "HGP明朝E" , 20 , 0 , DX_FONTTYPE_ANTIALIASING_EDGE);

non
記事: 1097
登録日時: 9年前

Re: 構造体に入れた文字列の表示ができません。

#5

投稿記事 by non » 8年前

問題なく動きます。サンプルです

コード:

#include "DxLib.h"
#include <string.h>

typedef struct
{
    int money;
    int life;
    char player_name[20];
}ch_t;
 
ch_t ch; 


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine, int nCmdShow )
{
	int font[1];
	int color[1];
	ch.money = 0;
	ch.life = 3;
	strcpy_s(ch.player_name,"あいうえお"); 

	ChangeWindowMode( TRUE ) ;
	if( DxLib_Init() == -1 ) return 0 ;
	color[0] = GetColor(255,255,255);
	font[0] = CreateFontToHandle( "HGP明朝E" , 20 , 0 , DX_FONTTYPE_ANTIALIASING_EDGE); 
	DrawFormatStringToHandle( 0 , 0 , color[0] , font[0] , "%s" , ch.player_name ); 
	WaitKey() ;
	DeleteFontToHandle( font[0] ) ;
	DxLib_End() ;
	return 0 ;
}
non

かば
記事: 7
登録日時: 8年前

Re: 構造体に入れた文字列の表示ができません。

#6

投稿記事 by かば » 8年前

char player_name[20];

char *player_name[20];
ポインタ変数にする。
ch.player_name = "あいうえお"; ←これを↓に変える。

char *c="00000000000000000000";//仮にいれる。自分は一応、要素数分だけなにかいれとく。
memcpy( player_name, c, 20 );
でできないでしょうか。
strcpyでもできます。使い方には気を付けましょう。20文字ならだいじょうぶでしょう。
memcpyよりstrcpyのほうが処理速度は速いです。(ほんと微妙ですが^^;)
自分は安パイとってmemcpyです。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: 構造体に入れた文字列の表示ができません。

#7

投稿記事 by beatle » 8年前

かばさん。
char *player_name[20];
はおかしいのではないでしょうか。char型へのポインタ20個分の配列っていう意味です。

char player_name[20];
の部分は変更せずに
memcpy(player_name, c, 20);
とするならば可能です。

化猫
記事: 15
登録日時: 9年前

Re: 構造体に入れた文字列の表示ができません。

#8

投稿記事 by 化猫 » 8年前

無事、思ったように動きました。
strcpy等の文字列関係の関数について理解を深めることも出来ました。
皆さん、回答ありがとうございました。

問題は解決とさせて頂きます。

かば
記事: 7
登録日時: 8年前

Re: 構造体に入れた文字列の表示ができません。

#9

投稿記事 by かば » 8年前

ごめんなさい。
確かに、おかしいですね。
ポインタに要素数は間違いでした。

混乱させてすみません。
beatle さんの言うとおりです。
化猫さん自分のレス飛ばして下さい。

閉鎖

“C言語何でも質問掲示板” へ戻る