構造体と文字化け

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
けんじ

構造体と文字化け

#1

投稿記事 by けんじ » 16年前

こんばんは。

WindowsAPIに関しての質問なのですが
構造体を定義し、そこにwsprintf関数やらlstrcpy関数で文字列を代入すると
実行したときに文字化けして表示されてしまいます。文字セットはUnicodeです。
typedef struct _tagSetString {
	TCHAR name[10];
	TCHAR sex[10];
} SetString;

// (中略)
// 関数内部
	SetString str;  // 宣言

	lstrcpy(str.name, TEXT("山田"));	// 2通りのやり方で
	wsprintf(str.sex, TEXT("男"));		// 入れてみました

	TextOut(hdc, 0, 0, str.name, 2);			// どちらとも
	TextOut(hdc, 0, 50, str.sex, lstrlen(str.sex));		// 文字化けします
構造体を使わないやり方などあるのかもしれませんが、
構造体を使った場合はどうなるのでしょうか。

関数の使い方等、根本的に間違っているかもしれませんが、よろしくお願いします。

BEMANI

Re:構造体と文字化け

#2

投稿記事 by BEMANI » 16年前

>>けんじさん
解決できるかわかりませんが、
str.name や str.sex の中に文字列を格納されている所ですが
・表示するまでの間で、何か変数を操作していませんか?
 (例えば文字列をクリアする等)
・デバッグで確認し、格納された文字列の内容が消えていると言った感じにはなっていませんか?
 (例えば二回目呼んだ時に値が保持されていない等)


試しにサンプルを組んでみましたが、こちらでは出てきました。(同じくUnicode文字セットです)
リターンキーを押すと、紫色でテキストが出てきます。
(ウインドウプロシージャに書きましたが、一部省略しています)
// 省略;
case WM_KEYDOWN:
	switch(wParam)
	{
	case VK_RETURN:
		lstrcpy(str.name, TEXT("ぐへへ山口abc"));
		wsprintf(str.sex, TEXT("男か女123"));

		hdc = GetDC(hWnd);
		SetTextColor(hdc, RGB(255, 0, 255) );			// 文字色変更
		TextOut(hdc, 0, 0, str.name, lstrlen(str.name));	// 表示
		TextOut(hdc, 0, 50, str.sex, lstrlen(str.sex));		// 表示
		ReleaseDC(hWnd, hdc);
	break;
	}
break;
// 省略;

けんじ

Re:構造体と文字化け

#3

投稿記事 by けんじ » 16年前

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

構造体とウィンドウを作成し描画するだけのシンプルなプログラムで実行してみると
確かにうまくいきました。

昨日は不慣れな構造体を、さらに配列として用いようとして、for文で文字列を代入していたのですが、
for文の条件式の中にあったスタティックなグローバル変数が邪魔をしていたようです。

昨日は、構造体を使うからこうなるんだ!文字コード事情は嫌いだ!とばかり思っていたのですが、
BEMANIさんの助言で原因はそこではないとわかり、視点が変わったことで一気に解決できました。

ありがとうございました。

閉鎖

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