どうしても表示できない文字がある

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

どうしても表示できない文字がある

#1

投稿記事 by namari » 10年前

drawformatstringを使って文章を描画しているのですが、
例えば「魔法使い」と書くと、「魔・」と表示されます。
デバッガで止めて確認して言ったところ「魔法使い」をいれたcharで「文字列中に無効な文字があります」と赤文字で警告されていました。
つまり「法」が無効な文字なのでしょうが、一体表示させるにはどうしたらいいのでしょうか。
フォントは特に変えていません。
この無効な文字はある特定の文字限定で起こるようです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: どうしても表示できない文字がある

#2

投稿記事 by h2so5 » 10年前

再現できるコードを書いてもらえますか。

アバター
namari
記事: 111
登録日時: 11年前

Re: どうしても表示できない文字がある

#3

投稿記事 by namari » 10年前

h2so5 さんが書きました:再現できるコードを書いてもらえますか。
すみません。

コード:

message_add(0,ch.name,"魔法攻撃!@",enemykind[enemy[j].kind].name,"は",dam_char[i],"のダメージを受けた");//@は改行の印。


void message_add(int icon,char id[],char message1[],char argument1[],char message2[],char argument2[],char message3[]){//アイコンの画像番号、名前、メッセージ1,受け取る引数、メッセージ2・・・
	char *tp;
	int i=0,j;
	char message[255];
	if(message_only_one_and_turn_end_flag==1){message_only_one_and_turn_end_flag=0;message_cnt=0;message_graph_cnt=1;last_message_clear_cnt=0;}
    message_cnt++;
    pre_icon[message_cnt]=icon;
	strncpy(pre_id[message_cnt],id,255);
	for(j=0;j<3;j++){sprintf(pre_message[j][message_cnt],"");}
    sprintf(message,"%s%s%s%s%s",message1,argument1,message2,argument2,message3);
/*デバッガで順々にステップアウトしていくとここのsprintfを終えたところでmessage内がおかしくなっている*/
	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);
    }
}
この後、文字描画に続くんですが、おそらくこの問題があるのはこの中だと思われます・・・。
sprintfの後が最も怪しいんですけどわかりません。

アバター
へろりくしょん
記事: 92
登録日時: 13年前
住所: 福岡

Re: どうしても表示できない文字がある

#4

投稿記事 by へろりくしょん » 10年前

SJIS に於いて "法" は、0x9640 の2バイトで構成されます。

改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。

改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。

初級者
記事: 200
登録日時: 13年前

Re: どうしても表示できない文字がある

#5

投稿記事 by 初級者 » 10年前

2バイト文字の1バイト目あるいは2バイト目に
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。

アバター
へろりくしょん
記事: 92
登録日時: 13年前
住所: 福岡

Re: どうしても表示できない文字がある

#6

投稿記事 by へろりくしょん » 10年前

初級者 さんが書きました:2バイト文字の1バイト目あるいは2バイト目に
¥n
と同じ文字コードを含んでいる(表、とか)と、
不幸せなままかもしれません。
エスケープシーケンスの事をおっしゃっているのでしょうか。
"表" に含まれるのは、'¥¥' であって、'¥n' ではありませんよ。

'¥n' のコードは 0x0A です。 これは、SJIS において、1バイト目にも2バイト目にも含まれません。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: どうしても表示できない文字がある

#7

投稿記事 by みけCAT » 10年前

へろりずむ さんが書きました:SJIS に於いて "法" は、0x9640 の2バイトで構成されます。

改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。

改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
/ (スラッシュ)を使用してもいいかもしれません。
漢字コードについてによると、Shift_JISの2バイト目は0x40~なので、
0x2Fである/は被らず、また入力も1文字ですみます。
他には、#,$,%なども使えます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

初級者
記事: 200
登録日時: 13年前

Re: どうしても表示できない文字がある

#8

投稿記事 by 初級者 » 10年前

お〜、間違い間違い。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: どうしても表示できない文字がある

#9

投稿記事 by softya(ソフト屋) » 10年前

初級者さん、丁寧な言葉づかいをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初級者
記事: 200
登録日時: 13年前

Re: どうしても表示できない文字がある

#10

投稿記事 by 初級者 » 10年前

これは大変失礼をいたしました。
以後、じゅうぶんに気をつける所存にございます。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: どうしても表示できない文字がある

#11

投稿記事 by ISLe » 10年前

わざわざ表示できる文字を潰して採用するメリットを教えて欲しいです。

アバター
namari
記事: 111
登録日時: 11年前

Re: どうしても表示できない文字がある

#12

投稿記事 by namari » 10年前

へろりずむ さんが書きました:SJIS に於いて "法" は、0x9640 の2バイトで構成されます。

改行の印として使用している "@" は、0x40 ですので、
"法" の2バイト目が、sprintf() 関数に続く strtok() 関数にて切り分けられている為に起きているようですね。

改行の印には、素直に '\n' 辺りを使うと恐らく幸せになれるでしょう。
おー、なるほど!
全く思いもよりませんでした。
\nで代用しました。
ISLe さんが書きました:わざわざ表示できる文字を潰して採用するメリットを教えて欲しいです。
ちなみにこれは、drawformatstringそれ自体で\nを入れて改行しても描画してくれないので、
一から改行作業をするに当たり、1文字で普段使わなそうで問題も起きなさそうな(実際は起きてしまいましたが)文字の中から何と無しに@を選んだのです。
今にして思えばこれに加えてそもそも文字を潰さないために2文字採用することが頭から抜けてましたね。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: どうしても表示できない文字がある

#13

投稿記事 by ISLe » 10年前

namari さんが書きました:今にして思えばこれに加えてそもそも文字を潰さないために2文字採用することが頭から抜けてましたね。
2文字採用ってどういうことでしょう。
'\n'は1文字(シフトJISで1バイト)ですけど別の話でしょうか。

DrawFormatStringが改行してくれないから自前で分割するというのは分かります。
その際に元の文字列の改行コードを別の表示できる文字に置き換えるメリットが分からないのです。

閉鎖

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