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

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

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

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

Q&A

解決済

5回答

2353閲覧

fprintfの中身をおしえて

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2016/01/24 06:48

プログラムの中にfprintf(dst, "%0*X ", (CHAR_BIT + 3) / 4, (unsigned)buf[i]);
の表示がありますが、(CHAR_BIT + 3) / 4, がよく分かりません。このfprintfの中身を詳しく教えてください。

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

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

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

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

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

guest

回答5

0

書式について
'%' : 書式指定であることを表す
'0' : 数値の足りない桁数を0で埋める
'*' : 引数で指定した値がここに入る。この位置は桁数なので引数で動的に桁数を指定するという時に使う
'X' : 整数値を16進数表記で出力する
※詳しくはリファレンスを参照してください。

(CHAR_BIT + 3) / 4
CHAR_BITはcharのビット数を表すので、通常は8と定義されています。16進数の桁数として渡しているので、4bitがいくつ分になるかを計算しています。8bitは16進数2桁ということになります。

通常は"%02X"で済むのですが、2の部分を*にして引数渡しで桁数を指定していることになります。ただし、最初から判っている桁数を引数渡しにすることはあまり一般的ではありません。

投稿2016/01/24 07:25

catsforepaw

総合スコア5938

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

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

退会済みユーザー

退会済みユーザー

2016/01/24 07:32

丁寧な説明でありがとうございました。これで1日インターネットで検索していました。 助かりました。
guest

0

C

1fprintf(dst, "%0*X ", (CHAR_BIT + 3) / 4, (unsigned)buf[i]);

の意味は、おおざっぱに言うと

  • buf[i] の内容を十六進数で適切な桁幅で出力する

という事です。

CHAR_BIT は limits.h に定義されている、char 型のビット数です。
現代の大体のCPU では char型が1バイトなので、 8 が定義されています。

bash

1$ cat sample.c 2#include <stdio.h> 3#include <limits.h> 4 5int main(int argc, char **argv) 6{ 7 printf( "[%d]\n", CHAR_BIT ); 8 9 return 0; 10} 11$ gcc -o sample sample.c 12$ ./sample 13[8] 14$

16進一桁は 4 ビットですので、出力しようとする変数の型のビット数を 4で割ることで必要な桁幅が求まります。
3 を足しているのはビット数がハンパな場合に適切な値がでるように補正するためです。

bash

1$ cat sample2.c 2#include <stdio.h> 3#include <limits.h> 4 5int main(int argc, char **argv) 6{ 7 int i; 8 9 for ( i = 1 ; i < 32; ++i ) { 10 printf( "[bit = %d][hex width = %d]\n", i, ( i + 3 ) / 4 ); 11 } 12 13 return 0; 14} 15$ gcc -o sample2 sample2.c 16$ ./sample2 17[bit = 1][hex width = 1] 18[bit = 2][hex width = 1] 19[bit = 3][hex width = 1] 20[bit = 4][hex width = 1] 21[bit = 5][hex width = 2] 22[bit = 6][hex width = 2] 23[bit = 7][hex width = 2] 24[bit = 8][hex width = 2] 25[bit = 9][hex width = 3] 26[bit = 10][hex width = 3] 27[bit = 11][hex width = 3] 28[bit = 12][hex width = 3] 29[bit = 13][hex width = 4] 30[bit = 14][hex width = 4] 31[bit = 15][hex width = 4] 32[bit = 16][hex width = 4] 33[bit = 17][hex width = 5] 34[bit = 18][hex width = 5] 35[bit = 19][hex width = 5] 36[bit = 20][hex width = 5] 37[bit = 21][hex width = 6] 38[bit = 22][hex width = 6] 39[bit = 23][hex width = 6] 40[bit = 24][hex width = 6] 41[bit = 25][hex width = 7] 42[bit = 26][hex width = 7] 43[bit = 27][hex width = 7] 44[bit = 28][hex width = 7] 45[bit = 29][hex width = 8] 46[bit = 30][hex width = 8] 47[bit = 31][hex width = 8] 48$

投稿2016/01/24 07:20

編集2016/01/24 07:51
kozuchi

総合スコア1193

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

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

退会済みユーザー

退会済みユーザー

2016/01/24 07:40

ありがとうございます。助かりました。
guest

0

fprintf(dst, "%0*X ", (CHAR_BIT + 3) / 4, (unsigned)buf[i]);

コードの意図としては、(明記がないですがchar型あたりの)バイト配列bufi番目を、2桁の16進数表記した文字列に変換し、文字列バッファdstへ代入しています。

例えばbuf[i]に値123が入っていたとすると、dstには文字列"7B "が格納されます。

投稿2016/01/24 07:08

yohhoy

総合スコア6191

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

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

0

答えではないです。
"%0*X "の意味は判りますか?
・・・分かれば(CHAR_BIT + 3) / 4の意味も判ると思いますが?
CHAR_BITは?
(CHAR_BIT + 3) / 4は 11/4→2・・・(CHAR_BITが8として)

例として

c

1~/test/cpptst >./a.out 2C 3C 40C 500C 6000C 70000C 800000C 9000000C 100000000C 1100000000C 12~/test/cpptst >cat tst02.c 13#include <stdio.h> 14 15int main() 16{ 17 for( int i= 0; i < 10; i++ ){ 18 printf( "%0*X\n", i, 12 ); 19 } 20 21 return (0); 22} 23~/test/cpptst >

投稿2016/01/24 06:57

編集2016/01/24 07:16
cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2016/01/24 07:41

ありがとうございます。助かりました。
guest

0

ベストアンサー

こんにちは。

CHAR_BITを4で割ってますね。そして、小数点以下を「切り上げ」てます。
CHAR_BITを4で割った時、1余ったとします。その1にも3を加えて4で割るので、結果が1増えるのです。
CHAR_BITを4で割った時、3余ったとしてます。(3+3)/4=1.5→1なので、やっぱり結果は1しか増えないわけです。

投稿2016/01/24 06:55

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2016/01/24 07:29

こんばんわ、いつもありがとうございます。 ラックナンバーリサーチのベストテン表示は教科書を読み直して、 それからと思っています。
Chironian

2016/01/24 08:02

学習のペースや順序は気にされる必要ないですよ。sanchu52さんが頑張っていることは十分に伝わってきていますので。 sanchu52さんの順序とペースで頑張られて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問