DXライブラリで改行がうまくいかない
Posted: 2013年8月10日(土) 14:30
DXライブラリは\nで改行を行わないと知り、
大量の文章処理を行う都合上、あるchar型の文章の中に「@」を加えると、
そこで次の行に改行する処理を作ってみたのですが、うまくいきません。
下の画像のように@が文章中につくだけで、改行が行われません。
おそらくstrtokの使い方に難があるのでしょうが、困ったことに今手元に簡単なコンパイラがなく、
テストコンパイルでstrtokの挙動が理解通りか確かめる術がないです。
問題を指摘していただけると幸いです。

大量の文章処理を行う都合上、あるchar型の文章の中に「@」を加えると、
そこで次の行に改行する処理を作ってみたのですが、うまくいきません。
下の画像のように@が文章中につくだけで、改行が行われません。
おそらくstrtokの使い方に難があるのでしょうが、困ったことに今手元に簡単なコンパイラがなく、
テストコンパイルでstrtokの挙動が理解通りか確かめる術がないです。
問題を指摘していただけると幸いです。
//GV.h
GLOBAL int message_cnt;//何個メッセージが書かれたかの最大値を見る
GLOBAL int message_graph_cnt;//メッセージを1から順に表示する
GLOBAL int message_rest_flag;//メッセージが2つ以上残っていたら移動させない
GLOBAL int pre_icon[1024];
GLOBAL char pre_id[1024][255];//pre_id[配列数][文字数]
GLOBAL char pre_message[3][1024][255];//pre_message[行目][配列数][文字数]
//message.cpp
//プロジェクト中のあちこちからメッセージを受け取る関数。1ターンに複数のメッセージを受け取ることもあるので、
//それを処理する。(敵を倒し、レベルが上がれば、「~に~ダメージ」「~をたおした」「レベルがあがった」の三つ)
void message_add(int icon,char id[],char message[]){//アイコンの画像番号、名前、メッセージ
char *tp;
int i=0;
message_cnt++;
pre_icon[message_cnt]=icon;
strncpy(pre_id[message_cnt],id,255);
tp = strtok( message, "@" );/*↓おそらくここから問題の場所*/
strncpy(pre_message[0][message_cnt],tp,255);
while ( tp != NULL ) {
i++;
tp = strtok( NULL,"@" );
if ( tp != NULL ) strncpy(pre_message[i][message_cnt],tp,255);
}
}
//上のmessage_addの拡張版。1つの引数を受け取れるようになった。
void message_add(int icon,char id[],char message1[],char argument[],char message2[]){//アイコンの画像番号、名前、メッセージ1,受け取る引数、メッセージ2
char *tp;
int i=0;
char message[255];
message_cnt++;
pre_icon[message_cnt]=icon;
strncpy(pre_id[message_cnt],id,255);
sprintf(message,"%s%s%s",message1,argument,message2);
tp = strtok( message, "@" );/*↓おそらくここから問題の場所*/
strncpy(pre_message[0][message_cnt],tp,255);
while ( tp != NULL ) {
i++;
tp = strtok( NULL,"@" );
if ( tp != NULL ) strncpy(pre_message[i][message_cnt],tp,255);
}
}
//メッセージウィンドウを表示する関数。
void graph_mess(){//メッセージウィンドウ(メッセージボックス、アイコン、ID名、メッセージ内容、時間)
if(clear_flag==1&&message_graph_cnt==message_cnt){message_graph_cnt++;}
if(message_cnt==0){
message_rest_flag=0;
}
else if(message_cnt-message_graph_cnt>=1){
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 200 );
DrawGraph(0,360,img_board[202] , FALSE );
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
DrawRotaGraph( 67, 360+23, (float)30/48, 0.0, img_user[pre_icon[message_graph_cnt]], FALSE );
DrawRotaGraph( 570, 460 , 1.0 , -PI/36*global_cnt ,img_board[203], TRUE );//メッセージ次あるよボタン
DrawFormatString( 100, 360+8, BLUE, pre_id[message_graph_cnt]);
DrawFormatString( 48, 360+54, BLACK, pre_message[0][message_cnt]);
DrawFormatString( 48, 360+74, BLACK, pre_message[1][message_cnt]);
DrawFormatString( 48, 360+94, BLACK, pre_message[2][message_cnt]);
DrawFormatStringToHandle( 106, 360+33, BLACK,small_font, "%02d:%02d" ,time_hour,time_minute);
message_rest_flag=1;
if(CheckStatePad(configpad.z)==1){message_graph_cnt++;}
}
else if(message_cnt-message_graph_cnt==0){
SetDrawBlendMode( DX_BLENDMODE_ALPHA, 200 );
DrawGraph(0,360,img_board[202] , FALSE );
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 0 );
DrawRotaGraph( 67, 360+23, (float)30/48, 0.0, img_user[pre_icon[message_graph_cnt]], FALSE );
DrawFormatString( 100, 360+8, BLUE, pre_id[message_cnt]);
DrawFormatString( 48, 360+54, BLACK, pre_message[0][message_cnt]);
DrawFormatString( 48, 360+74, BLACK, pre_message[1][message_cnt]);
DrawFormatString( 48, 360+94, BLACK, pre_message[2][message_cnt]);
DrawFormatStringToHandle( 106, 360+33, BLACK,small_font, "%02d:%02d" ,time_hour,time_minute);
message_rest_flag=0;
}
}
