printfによる日本語出力の文字化け

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

printfによる日本語出力の文字化け

#1

投稿記事 by えるご » 13年前

日本語文字列からある一定の長さの文字数だけ出力するプログラムを作っています。
日本語はchar3文字分だったので、char変数Aに入れた文字列を3文字ごとに設定した長さを超えないか判別し、超えた場合別のchar変数Bに
それまでのchar変数Aの中身を入れてそれを出力するプログラムです。
動作は問題ないのですが、出力が「・・・・・・・・・・・・・・・・・・・・・・・・・・・・・」と完全に文字化け状態になっています。
どうすれば解決するでしょうか。 よろしくお願いします。

プログラムを以下に貼ります。


コード:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define WORD_MAX 84

void printtext(char *string)
{
  int i;
  printf("%s",string);
  puts(string);
}

void textprocess(char *string,int font)
{
  static int words =0;
  int tmpwords = words;
  int i=0;
  int j;
  int k =0;
  char sendstring[1000];
  while(string[i] != '\0'){
    i = i + 3;
    if(words == WORD_MAX){
      for(j = tmpwords;j<WORD_MAX;j++){
        sendstring[k] = string[j+k];
        k++;
      }
      sendstring[k] = '\n';
      printtext(sendstring);
      for(j=0;j<1000;j++){
        sendstring[j] = '\0';
      }
      words = 0;
      tmpwords = 0;
      k=0;
    }
    else{
      words = words + 2;
    }

  }
  return;
}

int main()
{
  char str[1000];
  int font =0;
  scanf("%s",str);
  textprocess(str,font);
}


box
記事: 2002
登録日時: 15年前

Re: printfによる日本語出力の文字化け

#2

投稿記事 by box » 13年前

入力データの例も示してくださると、解決のヒントが何か見つかるかもしれませんし、
あるいは、それでもどうにもならないかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
asd
記事: 319
登録日時: 15年前

Re: printfによる日本語出力の文字化け

#3

投稿記事 by asd » 13年前

えるご さんが書きました:日本語はchar3文字分だったので、
文字コードの種別にもより必ずしも3文字分(3バイト分)とは限りません。
2文字分(2バイト分)となる文字コードもあります。

あとどのような入力文字に対してどのような出力を望んでいるのかを併記すると
より分かりやすくなりますよ。

3文字分の環境で行うものと仮定して気になる箇所は2箇所あります。
えるご さんが書きました:

コード:


void printtext(char *string)
{
  int i;
  printf("%s",string);
  puts(string);
}
ここでstringを2回出力しているのは意図した動きでしょうか。
えるご さんが書きました:

コード:

      for(j = tmpwords;j<WORD_MAX;j++){
        sendstring[k] = string[j+k];
        k++;
      }
このfor文ですが、sendstringに入力文字stringの先頭からWORD_MAXバイト分を取り出す処理だと
思いますが、string側の添え字が[j+k]となっているためループごとに2ずつ増えています。
その結果取り出したsendstringが文字化けしています。

デバッガを使ってステップ実行するとどのように文字が取り出されているのか確認できますので
お勧めです。

あと気になることとして、
・入力文字が全角と半角の混在の場合、全角文字が途中で切れてしまう場合がある
→入力を「1あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん」とすると「ひ」の次が化けます
・日本語文字はchar3文字分としながらwordsを2ずつ増やしているのは何故?
・文字列終端を判定するのに使っているiと文字列長オーバー判定に使っているwordの増分が異なるので、
 文字列長がWORD_MAXを少し超えただけの場合、正しく判定されない
→入力を「あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへ」とした場合、WORD_MAXを超えていますが何も出力されません

また分からない点があれば遠慮せず聞いてくださいね。
Advanced Supporting Developer
無理やりこじつけ(ぉ

閉鎖

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