質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

591閲覧

漢字が正しく表示されない

hinatti

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/08/07 06:37

編集2017/08/07 08:16

###前提・実現したいこと
ファイルダンププログラムを作成しているのですが、漢字が正しく表示できないです。

###発生している問題・エラーメッセージ

一部が文字化けしてしまう

###該当のソースコード

C言語

1typedef struct _DumpData{ 2 unsigned char fileName[MAX]; //ファイル名 3 unsigned char data[MAX]; //読み込んだデータ 4 long size; //ファイル容量 5 int contents; //freadの戻り値 6 int blockSize; //ブロックサイズ 7 int totalBlock; //総ブロック数 8 FILE* file_pointer; //ファイルポインタ 9 int format; //表示フォーマット 10 int chinese_characters; //漢字表示 11 int blockNumber; //現在のブロック番号 12 unsigned char errorField[40]; //エラー表示フィールド 13} DumpData; 14 15//↑構造体です。 16void file_display_one(DumpData* pointer) 17{ 18 unsigned char key; 19 int output;//出力桁数 20 int hex = 0;//16進数カウンタ 21 int asc = 0;//文字カウンタ 22 int line_number;//行番号 23 short character_flag = 0;//文字フラグ 24 25 printf(" Addr Hex ASCII\n"); 26 27 //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し 28 line_number = 0; 29 while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number) 30 { 31 //行番号の表示 32 printf(" %05X ", line_number); 33 34 //16個出力するまでループ 35 for (output = 0; DISPLAY_MAX_ONE > output; output++) 36 { 37 //freadの戻り値が出力数より大きいとき 38 if (pointer->contents > hex) 39 { 40 //8個目と9個目の間に"-"表示 41 if (output == 7) 42 { 43 printf("%02X-", pointer->data[hex]); 44 } 45 else 46 { 47 printf("%02X ", pointer->data[hex]); 48 } 49 50 hex++; 51 } 52 else 53 { 54 printf(" "); 55 } 56 } 57 58 //16文字出力するまでループ 59 for (output = 0; DISPLAY_MAX_ONE > output; output++) 60 { 61 //freadの戻り値が出力数より大きいとき 62 if (pointer->contents > asc) 63 { 64 key = pointer->data[asc]; 65 66 //漢字表示ONの時(SHIFT-JIS) 67 if (pointer->chinese_characters == 1) 68 { 69 //全角文字の1byte目の時 70 if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc)) 71 { 72 //出力文字数が16の時 73 if (output == 15) 74 { 75 putchar('$'); 76 character_flag = RET_OK;//文字フラグを1にする 77 } 78 else 79 { 80 putchar(key); 81 } 82 } 83 else 84 { 85 //文字フラグが1の時 86 if (character_flag == RET_OK) 87 { 88 putchar('$'); 89 character_flag = 0;//文字フラグを0にする 90 } 91 //半角文字の時 92 else if ((key >= 0x20) && (key <= 0x7e)) 93 { 94 putchar(key); 95 } 96 //全角文字、半角文字でもない場合 97 else 98 { 99 putchar('$'); 100 } 101 } 102 } 103 //漢字表示OFFの時(ASCII) 104 else 105 { 106 //半角文字の時 107 if ((key >= 0x20) && (key <= 0x7e)) 108 { 109 putchar(key); 110 } 111 else 112 { 113 putchar('$'); 114 } 115 } 116 117 asc++; 118 } 119 else 120 { 121 putchar(' '); 122 } 123 } 124 125 line_number++;//行番号のカウントアップ 126 printf("\n"); 127 128 //4行出力ごとに改行 129 if ((line_number % 4) == 0) 130 { 131 printf("\n"); 132 } 133 } 134}

###試したこと
ファイルの内容を配列に格納して配列の先頭から1バイトずつ判断しようとしてみました。あと、printfの%sも試したのですがプログラムが終了しちゃいます。

###補足情報(言語/FW/ツール等のバージョンなど)
サクラエディタ、SDKコマンドプロンプトで開発しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

showkit

2017/08/07 08:07

 大体の想像はつくような気がしますが・・・。Q1. DumpData とは どんな型ですか? Q2. 入力ファイルはテキストファイルですか?
hinatti

2017/08/07 08:09

DumpDateは構造体で、入力ファイルはテキストファイルです。
showkit

2017/08/07 08:15

不勉強でわかっていなかったらごめんなさい。DumpData という汎用の型があるのですか?汎用でなければ DumpData 構造体の定義も 提示していただかないと・・・。
hinatti

2017/08/07 08:16

今提示しました。
guest

回答2

0

ベストアンサー

ご提示PGに少しだけ手を加えてみました。SJIS用ですが。

c

1void file_display_one(DumpData* pointer) 2{ 3 unsigned char key; 4 int output;//出力桁数 5 int hex = 0;//16進数カウンタ 6 int asc = 0;//文字カウンタ 7 int line_number;//行番号 8 short character_flag = 0;//文字フラグ 9 short character_zen = 0;//文字フラグ 10 11 printf(" Addr Hex ASCII\n"); 12 13 //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し 14 line_number = 0; 15 while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number) 16 { 17 //行番号の表示 18 printf(" %05X ", line_number); 19 20 //16個出力するまでループ 21 for (output = 0; DISPLAY_MAX_ONE > output; output++) 22 { 23 //freadの戻り値が出力数より大きいとき 24 if (pointer->contents > hex) 25 { 26 //8個目と9個目の間に"-"表示 27 if (output == 7) 28 { 29 printf("%02X-", pointer->data[hex]); 30 } 31 else 32 { 33 printf("%02X ", pointer->data[hex]); 34 } 35 36 hex++; 37 } 38 else 39 { 40 printf(" "); 41 } 42 } 43 44 //16文字出力するまでループ 45 for (output = 0; DISPLAY_MAX_ONE > output; output++) 46 { 47 //freadの戻り値が出力数より大きいとき 48 if (pointer->contents > asc) 49 { 50 key = pointer->data[asc]; 51 52 //漢字表示ONの時(SHIFT-JIS) 53 if (pointer->chinese_characters == 1) 54 { 55 //全角文字の2byte目の時 56 if (character_zen == RET_OK) 57 { 58 putchar(key); 59 character_zen = 0;//文字フラグを0にする 60 } 61 //文字フラグが1の時 62 else if (character_flag == RET_OK) 63 { 64 putchar('$'); 65 character_flag = 0;//文字フラグを0にする 66 } 67 //全角文字の1byte目の時 68 else if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc)) 69 { 70 //出力文字数が16の時 71 if (output == 15) 72 { 73 putchar('$'); 74 character_flag = RET_OK;//文字フラグを1にする 75 } 76 else 77 { 78 putchar(key); 79 character_zen = RET_OK;//文字フラグを1にする 80 } 81 } 82 else 83 { 84 //半角文字の時 85 if ((key >= 0x20) && (key <= 0x7e)) 86 { 87 putchar(key); 88 } 89 //半角カナ文字の時 90 else if ((key >= 0xa1) && (key <= 0xdf)) 91 { 92 putchar(key); 93 } 94 //全角文字、半角文字でもない場合 95 else 96 { 97 putchar('$'); 98 } 99 } 100 } 101 //漢字表示OFFの時(ASCII) 102 else 103 { 104 //半角文字の時 105 if ((key >= 0x20) && (key <= 0x7e)) 106 { 107 putchar(key); 108 } 109 else 110 { 111 putchar('$'); 112 } 113 } 114 115 asc++; 116 } 117 else 118 { 119 putchar(' '); 120 } 121 } 122 123 line_number++;//行番号のカウントアップ 124 printf("\n"); 125 126 //4行出力ごとに改行 127 if ((line_number % 4) == 0) 128 { 129 printf("\n"); 130 } 131 } 132} 133

投稿2017/08/08 05:25

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hinatti

2017/08/08 05:54

おぉ…!ありがとうございます…! いけそうなんですけどこのプログラムを参考にさせていただいて組み込んでみたのですが何故か所々変な改行が入ってしまいます…
hinatti

2017/08/08 06:01

すみません、マルチバイト文字の2バイト目のフラグを文字フラグと間違えたのが原因でしたw おかげさまで完成しました、本当にありがとうございました!
guest

0

まずどの文字コードを想定していますかね?UTF-8ならこれではだめです(1byte-4byte使うため)。また1byte目のときもputcharで出力しているようですがこれが原因では?1文字を表す最後の単位数のときにまとめてprintfかなにかで出力しましょう。

printfの%sも試したのですがプログラムが終了しちゃいます。

文字列はNULL終端されていますか?

投稿2017/08/07 08:33

編集2017/08/07 08:33
yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hinatti

2017/08/07 09:22

あ、shift-jisを想定しています。 %c%cみたいにですかね あ、してなかったです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問