トップページ > 過去ログ > 記事閲覧
strtok_sで文字化けします。
名前:ソラシド 日時: 2006/11/03 23:32

初めまして。DXライブラリにはいつもお世話になっています。 下のコードはstrtok_s()で分割した文字を返してDrawString()で表示するというものなのですが、 表示するときにいつも最初の4バイト分が文字化けしてしまいます↓ 「・・・ァ、基礎、根拠(=basis)/〜を創立する」 #include <string.h> char* JapaneseSentence(char *) ; //WinMain char Sentence[] = "foundation (n/v),創立、基礎、根拠(=basis)/〜を創立する,(found)" ; char *mozi ; mozi = JapaneseSentence(Sentence) ; DrawString( 32, 90,mozi , GetColor( 255, 255, 255 ) ) ; char* JapaneseSentence(char *sentence) { char *nexttoken ; char JpnSent[ 500 ] ; char *Bun ; strcpy_s( JpnSent, sizeof(JpnSent), sentence ) ; Bun = strtok_s( JpnSent, ",", &nexttoken ) ; Bun = strtok_s( NULL, ",", &nexttoken ) ; return Bun ; } VisualC++ 2005でこれを実行したときは文字化けしてしまうのですが、 BorlandC++では(strtok_sをstrtokにして)文字化けせずにちゃんと表示できました。 何か改善方法がありましたらお教えください。お願いします。

Page: 1 |

Re: strtok_sで文字化けします。 ( No.1 )
名前:Will 日時:2006/11/04 10:37

strtok_sに関数ローカル変数を渡しているためと思われます。 strtok_sの戻り値で返ってくるポインタは、JpnSentエリアのどこかです。 そのため、関数抜けた時点でJpnSentのエリアが開放されて、先頭部分を別の変数として使用して値更新を行っているため表示がおかしくなるのではないでしょうか。 BCCでうまくいくのはコンパイラの違いによる、プログラム実行タイミングの微妙な差かと思います。(マルチスレッドアプリケーションであればですが) VCのほうでも、関数を抜けるまでは正しい情報を維持していると思います。 JpnSentを"static char"で宣言すれば直るのではないでしょうか。 ただし、マルチスレッドプログラムで複数スレッドから同時にJapaneseSentenceをコールする場合はこの修正では駄目ですが。 参照 h ttp://www9.plala.or.jp/sgwr-t/lib/strtok.html 見当違いだったらごめんなさい。
Re: strtok_sで文字化けします。 ( No.2 )
名前:ソラシド 日時:2006/11/06 00:15

ありがとうございます!しっかり成功しました。 なるほど・・・。ローカル変数のポインタを返させちゃっているんですね。 たまたま、最初の4バイトだけが文字化けしているけど、全部文字化けしててもおかしくなかったということですか。 親切な説明ありがとうございました!!

Page: 1 |