ページ 11

文字列のポインタ

Posted: 2012年10月23日(火) 19:10
by ジャン
文字列のポインタについて質問です。
画面に”い”と表示したいのですがエラーとなります。
何故なのでしょうか?

コード:

#include "DxLib.h"
 
static int m_Key[256];  // キーの入力状態格納用変数
char *name[]={"あいうえお",
			  "かきくけこ"};

// キーの入力状態更新
void Keyboard_Update(){
        char tmpKey[256];             // 現在のキーの入力状態を格納する
        GetHitKeyStateAll( tmpKey );  // 全てのキーの入力状態を得る
        for( int i=0; i<256; i++ ){ 
                if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
                        m_Key[i]++;   // 加算
                } else {              // 押されていなければ
                        m_Key[i] = 0; // 0にする
                }
        }
}

// KeyCodeのキーの入力状態を取得する
int Keyboard_Get( int KeyCode ){
        return m_Key[ KeyCode ]; // KeyCodeの入力状態を返す
} 

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

	int white=GetColor(255,255,255);

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey( KEY_INPUT_ESCAPE )==0 ){//ここから繰り返し
		Keyboard_Update();



		DrawFormatString(10,100,white,"%s",name[0][1]);
    }
 
    DxLib_End();
    return 0;
}

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 19:17
by h2so5
エラーの内容を書いてください

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 19:18
by softya(ソフト屋)
エラーはちゃんと掲載してくださいね。
たぶん問題であろうところを勘で書くと%sはchar*型(文字列)を引数としますが、name[0][1]はchar型(文字)です。違いは分かりますか?
なぉ、漢字はshift-jisの場合char2文字分ですので表示のアプローチ自体が間違っています。

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 20:37
by ジャン
アドバイスを元に調べたところ”文字”には%cを使う事がわかりました。
しかし、ひらがなで表示しようとすると”.”と表示されました。
どうすればいいのでしょうか。

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 20:52
by みけCAT

コード:

DrawFormatString(10,100,white,"%c%c",name[0][2],name[0][3]);
これでどうでしょうか?(無保証)

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 20:53
by softya(ソフト屋)
softya(ソフト屋) さんが書きました: なぉ、漢字はshift-jisの場合char2文字分ですので表示のアプローチ自体が間違っています。
と書いたのですが理解されていますか?
%cはchar1文字分ですので、それだけでは文字として成立していませんよ。

shift-jisはマルチバイト文字と呼ばれ1バイトと2バイトの文字が混在する文字コードです。
俗にいう半角文字は1バイト、全角文字は2バイトと思ってください。

まず、こういう所を勉強してもらうと良いと思います。
「Shift_JIS - Wikipedia」
http://ja.wikipedia.org/wiki/Shift_JIS
「半角と全角の混在するShiftJIS文字コードの扱い方(C/C++) - プログラミング講座 - fuku研究所」
http://www5f.biglobe.ne.jp/~fuku-labo/l ... /2/076.htm

みけCATさんの方法だと全角しか使わないのならOKのはずです。

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 21:39
by ジャン
>>みけCATさん
こんな表示の仕方があったのですか。参考になりました。

>>ソフト屋さん
半角と全角のバイトの違いはわかります。
ゲームに使うサウンドノベル風文字列のメッセージボックスを作ろうと思っているのですが、
とても難しそうですね。

Re: 文字列のポインタ

Posted: 2012年10月23日(火) 21:45
by softya(ソフト屋)
ちゃんと処理すると結構めんどうです。

ISLeさんが作ったのがあるので参考にしてみてください。
「ノベルゲーム風に一文字ずつ表示する: ISLeのビデオゲーム工房」
http://isle.cocolog-nifty.com/blog/2011 ... .html#more
「禁則処理付き折り返し文字列描画【ShiftJIS版/改行付き】: ISLeのビデオゲーム工房」
http://isle.cocolog-nifty.com/blog/2011 ... .html#more