C言語関係掲示板

過去ログ

No.1039 "%.d"  "%.nd" "%.s" "%.ns" の違い

[戻る] [ホームページ]
No.13367

書式指定子について
投稿者---ROXY(2004/03/26 17:05:37)


お世話になっております。
書式指定子について勉強していて、以下の内容が理解できずに悩んでいます。

[int型の場合]
int x = 12345;

printf("%.d\n", x);

[出力結果]
12345

[文字列の場合]
char str[] = {"ABC"};

printf("%.s\n", str);
[出力結果]
出力されません
-----------------------------------------
そもそも%.ndとかだと、n桁で右詰に表示(変数がn桁より小さい桁
では0が表示される)と理解していたのですが、%.dだけで表示され
ています。%.dだけでnの指定がなく表示される理由についてわかり
ません。

また、%.sとすると、今度は何も表示されなくなり文字列とでは扱い
が異なるのでしょうか?




No.13372

Re:書式指定子について
投稿者---nop(2004/03/26 17:19:51)


>そもそも%.ndとかだと、n桁で右詰に表示(変数がn桁より小さい桁
>では0が表示される)と理解していたのですが、%.dだけで表示され
>ています。%.dだけでnの指定がなく表示される理由についてわかり
>ません。
>
>また、%.sとすると、今度は何も表示されなくなり文字列とでは扱い
>が異なるのでしょうか?


各変換指示子で「精度」をどう扱うか?と言う所でしょう。
精度以上に表示文字数がある場合に、
変換指示子「d」や「c」などではその分の出力を行いますが、
変換指示子「s」や「f」などでは精度分の出力がなされるようです。

No.13374

Re:書式指定子について
投稿者---tetrapod(2004/03/26 17:29:43)


ここはむっちゃわかりにくいとこです。
%.d %.s は %.0d %.0s と同じです。んで、

%.Nd : 最小 N 桁を表示。
表示する数値が N 桁に満たない場合は頭に 0 をつける。
表示する数値が N 桁を超える場合は、無視される。
N の指定が無いときは 1 が指定されたことになる。

%.Ns : 最長 N 文字を表示。
表示する文字が N 文字未満のときは意味なし。
N の指定が無いときは最長文字数制限が無い (\0 まで表示) 。

ということで仕様どおりの動きです。


No.13375

Re:書式指定子について
投稿者---ROXY(2004/03/26 17:48:59)


むむむ・・・、思っていたより難しいんですね。

>%.Ns : 最長 N 文字を表示。
>N の指定が無いときは最長文字数制限が無い (\0 まで表示) 。

すなわち、%.sとした場合に何も表示されないのは最長文字数制限
が無いことと関係しているのでしょうか?
また、初心者なので「仕様どおりの動き」とは」何を指しているの
かよくわかりません。教えてください。。




No.13377

Re:書式指定子について
投稿者---tetrapod(2004/03/26 18:14:03)


えっとよく読んでください。
%.s は %.0s と同じ、つまり N=0 を指定したのと同じです。よって
0文字が表示される=表示されない、のが printf() の仕様どおりです。

N が指定されない場合というのは精度指定が無い、つまり .N が無い場合の話です。
printf("|%s|", "ABC"); みたいに。

幅指定と組み合わせて printf("|%5.2s|", "ABC"); とすると
|___AB| (スペースは見えなくなるので _ で代用)
となります。
printf("|%5.s|", "ABC"); なら |_____| ですね。
printf("|%5s|", "ABC"); なら |__ABC| です。


No.13381

Re:書式指定子について
投稿者---NykR(2004/03/26 18:41:59)


とりあえず、「仕様」(JIS X 3010:2003)の関係ある部分。

7.19.6.1 fprintf関数

  (...略...)

− 省略が可能な精度 (precision)。 これは, d, i, o, u, x及びX変換に対しては, 出力する数字の最小の個数を, (...略...), そしてs変換に対しては, 書き込む最大のバイト数を指定する。精度の形式は, ピリオド (.) の後ろにアステリスク* (この箇条で規定) 又は省略が可能な10進整数を続けたものとする。ピリオドだけを指定した場合,0を精度に指定したものとして扱う。(...略...)

No.13423

Re:書式指定子について
投稿者---ROXY(2004/03/29 13:15:44)


nopさん、tetrapodさん、NykRさん、ありがとうございました。
printfの仕様について学習し、ようやく理解することができました。
書式指定についての理解が足らなかったことを痛感しました。