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

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

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

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

Q&A

解決済

3回答

3177閲覧

C言語ダンプで出力したい

kokok

総合スコア145

C

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

0グッド

1クリップ

投稿2019/08/06 05:39

編集2019/08/06 07:20

c

1 2#include <stdio.h> 3#pragma warning(disable: 4996) 4 5#define H_PRT 0x02// ヘッダ印字オプション 6#define C_PRT 0x01// 文字印字オプション 7#define ROW 16 // 1行に表示する文字 8//プロトタイプ宣言 9void dump(char title, char* staddr, int offset, int dsize, char opt); 10 11void main(void) { 12 13 int filcnt;// フィル用のカウンタ 14 15 char bin_data[512];// テストデータ用のバッファ 16 char asc_data[] = "01234567809 ABCあいうえおかきくけこDEFGHIJKLMNOPQRSTUVWXYZ 漢字表示のテスト abcdefghijklmnopqrstuvwxyz01234567809ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz"; 17 18 for (filcnt = 0; filcnt < 512; filcnt++) bin_data[filcnt] = filcnt & 0xff; // テスト用のテーブルを0からFFで埋める 19 20 dump("\nASCIIdata 文字印字あり", asc_data, 0, 65, H_PRT + C_PRT); 21 dump("\nBINARYdata 文字印字あり", bin_data, 0, 512, H_PRT + C_PRT); 22} 23 24 25void dump(char title, char* staddr, int offset, int dsize, char opt) { 26 27 int startcnt = 0;// ダンプするバイト数のカウント 28 int bytecnt; // 16回ループさせる 29 int display = 0; //表示文字 30 while (startcnt < dsize) { 31 32 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 33 34 if (startcnt < dsize) { 35 36 printf("%02x", staddr[display]); 37 38 display++; 39 40 } 41 else 42 43 printf(" "); 44 45 display++; 46 47 } 48 startcnt++; 49 50 printf("\n"); 51 } 52}

出力を

0001 0203 0405 0607 0809 0a0b 0c0d 0e0f
1011 1213 1415 1617 1819 1a1b 1c1d 1e1f
2021 2223 2425 2627 2829 2a2b 2c2d 2e2f
3031 3233 3435 3637 3839 3a3b 3c3d 3e3f
4041 4243 4445 4647 4849 4a4b 4c4d 4e4f
5051 5253 5455 5657 5859 5a5b 5c5d 5e5f
6061 6263 6465 6667 6869 6a6b 6c6d 6e6f
7071 7273 7475 7677 7879 7a7b 7c7d 7e7f
8081 8283 8485 8687 8889 8a8b 8c8d 8e8f
9091 9293 9495 9697 9899 9a9b 9c9d 9e9f
a0a1 a2a3 a4a5 a6a7 a8a9 aaab acad aeaf
b0b1 b2b3 b4b5 b6b7 b8b9 babb bcbd bebf
c0c1 c2c3 c4c5 c6c7 c8c9 cacb cccd cecf
d0d1 d2d3 d4d5 d6d7 d8d9 dadb dcdd dedf
e0e1 e2e3 e4e5 e6e7 e8e9 eaeb eced eeef
f0f1 f2f3 f4f5 f6f7 f8f9 fafb fcfd feff

このようにしたいのですが
うまくいきません。  アドバイス頂けると助かります。

-----追記部分-----

303132333435363738303920414243ffffff82
ffffffa0ffffff82ffffffa2ffffff82ffffffa4ffffff82ffffffa6ffffff82ffffffa8ffffff82ffffffa9ffffff82ffffffabffffff82ffffffadffffff82
ffffffafffffff82ffffffb14445464748494a4b4c4d4e4f50
5152535455565758595a20ffffff8affffffbfffffff8effffff9affffff95
5cffffff8effffffa6ffffff82ffffffccffffff8365ffffff8358ffffff83672061626364
65666768696a6b6c6d6e6f7071727374
75767778797a30313233343536373830
394142434445464748494a4b4c4d4e4f
505152535455565758595a2061626364
.
.
.
.
303132333435363738393a3b3c3d3e3f

ffffffb0ffffffb1ffffffb2ffffffb3ffffffb4ffffffb5ffffffb6ffffffb7ffffffb8ffffffb9ffffffbaff
C:\Users\admin\source\repos\Project1\Debug\Project1.exe (プロセス 19156) は、コード -1073741819 を伴って終了しました。
このウィンドウを閉じるには、任意のキーを押してください . . .

コードを実行するとこのような結果になってしまいます。

----追記部分2----

c

1void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt) { 2 3 int startcnt = 0;// ダンプするバイト数のカウント 4 int bytecnt; // 16回ループさせる 5 int savecnt = 0; 6 7 while (startcnt < dsize) { 8 9 savecnt = startcnt; 10 11 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 12 13 if (startcnt < dsize) { 14 printf("%02x", staddr[startcnt]); //16進数で出力 15 } 16 else { 17 printf(" "); 18 } 19 if (startcnt % 2 != 0) { 20 printf(" "); 21 } 22 startcnt++; 23 } 24 25 }

16進数の表示は上記のコードに修正して上手くいきました。

しかし、文字で表示しようとすると

c

1//文字の出力 2 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 3 4 startcnt = savecnt; 5 6 if (startcnt < dsize) { 7 printf("%c", staddr[startcnt]); 8 } 9 else { 10 printf(" "); 11 } 12 if (startcnt % 2 != 0) { 13 printf(" "); 14 } 15 startcnt++; 16 } 17 printf("\n"); 18 19}

結果
3031 3233 3435 3637 3830 3920 4142 4382 a082 a282 a482 a682 a882 a982 ab82 ad82 af82 b144 4546 4748 494a 4b4c 4d4e 4f50 5152 5354 5556 5758 595a 208a bf8e 9a95 5c \\\\
0001 0203 0405 0607 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 3839 3a3b 3c3d 3e3f 4041 4243 4445 4647 4849 4a4b 4c4d 4e4f 5051 5253 5455 5657 5859 5a5b 5c5d 5e5f 6061 6263 6465 6667 6869 6a6b 6c6d 6e6f 7071 7273 7475 7677 7879 7a7b 7c7d 7e7f 8081 8283 8485 8687 8889 8a8b 8c8d 8e8f 9091 9293 9495 9697 9899 9a9b 9c9d 9e9f a0a1 a2a3 a4a5 a6a7 a8a9 aaab acad aeaf b0b1 b2b3 b4b5 b6b7 b8b9 babb bcbd bebf c0c1 c2c3 c4c5 c6c7 c8c9 cacb cccd cecf d0d1 d2d3 d4d5 d6d7 d8d9 dadb dcdd dedf e0e1 e2e3 e4e5 e6e7 e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f7 f8f9 fafb fcfd feff 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 3637 3839 3a3b 3c3d 3e3f 4041 4243 4445 4647 4849 4a4b 4c4d 4e4f 5051 5253 5455 5657 5859 5a5b 5c5d 5e5f 6061 6263 6465 6667 6869 6a6b 6c6d 6e6f 7071 7273 7475 7677 7879 7a7b 7c7d 7e7f 8081 8283 8485 8687 8889 8a8b 8c8d 8e8f 9091 9293 9495 9697 9899 9a9b 9c9d 9e9f a0a1 a2a3 a4a5 a6a7 a8a9 aaab acad aeaf b0b1 b2b3 b4b5 b6b7 b8b9 babb bcbd bebf c0c1 c2c3 c4c5 c6c7 c8c9 cacb cccd cecf d0d1 d2d3 d4d5 d6d7 d8d9 dadb dcdd dedf e0e1 e2e3 e4e5 e6e7 e8e9 eaeb eced eeef f0f1 f2f3 f4f5 f6f7 f8f9 fafb fcfd feff 

文字が表示されません。
printf("%c", staddr[startcnt]);
ここの出力がおかしいのでしょうか?

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

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

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

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

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

y_waiwai

2019/08/06 05:41

現状のコードではどうなるんでしょうか 質問に追記してください
coco_bauer

2019/08/06 05:49

「ダンプで出力」というのは、どういう意味で使っていますか?
kokok

2019/08/06 05:52

メモリの内容を出力したいと考えております(16進数で)
guest

回答3

0

ときどき長い表示があるのは、符号付き整数を表示しようとして、上位の ffffff が出ています。
unsigned char* staddr にしてください。

あとは、カウンターが多すぎて、自分で役割を把握し切れていないようなので、

C

1void dump(char *title, unsigned char *staddr, int offset, int dsize, char opt) { 2 int i; 3 for(i=0; i<dsize; i++){ 4 ~~~~~ 5 } 6}

とカウンターは1つにするのが良いです。iが何かの倍数の時に空白を表示したり、改行を表示したりします。

投稿2019/08/06 05:57

otn

総合スコア84598

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

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

0

そもそも

C

1dump("\nASCIIdata 文字印字あり", asc_data, 0, 65, H_PRT + C_PRT); 2 3void dump(char title, char* staddr, int offset, int dsize, char OPT) { ...

だと、第1パラメータの型が合ってませんよ?

欲しい出力は2バイト毎に区切りがあり、16バイトで行が変わる、で合っていますかね?

であれば dump の中の1行出力するための処理が正しくありません。この中で「2バイト分出力したら間を空ける」がないのですから、間が空かないのは当然です。

※まあ、dump の offset が使われてないとか、突っ込みどころはありますけど、そこは勉強のためにご自身で考えるべきでしょうね

投稿2019/08/06 05:51

tacsheaven

総合スコア13703

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

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

0

自己解決

for (bytecnt = 0; bytecnt < ROW; bytecnt++) {

startcnt = savecnt;

部分の
startcnt = savecnt;

をfor文の外に書き解決いたしました。

投稿2019/08/06 07:52

kokok

総合スコア145

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問