3.printfを使いこなそう

3-6. その他の変換指定子

◆変換指定子(その他)

◇%%

これはprintf()の文字列中に%を表示するものです。前にも似たようなものがありましたね(\\で\を表示する)

#include<stdio.h>
main()
{
    printf("%%\n");
}

結果:
%

◇%p

次に%pこれは引数をアドレスとして表示します。(もちろん16進数)
よって引数にはvoidのポインタを使用します。要するに対象となる変数の型は何でもOKと言う意味です。

といっても普通に引数を渡せば数値を大文字16進数にしてあまった桁は0で埋めて表示するだけです。(%Xにあまった桁を0で埋めるのと同じ)

だから、

#include<stdio.h>

main()
{
    printf("%p\n",255);
}

結果:
000000FF

と表示されますが、せっかくアドレス用の変換指定子なので、ある変数のアドレスを表示させましょう。

#include<stdio.h>
main()
{
    int a=0;
    printf("%p\n",&a);
}

結果:
0065FDF4

と表示されました。なおこの値は通常毎回変わります。
プログラムを実行すると適当にメモリが空いた区間に変数用の領域を確保するので、そのときのアドレスが毎回変わるためです。

ちなみに&aは変数aのアドレスです。注意点として変数は必ず初期化してください。さもないとメモリに確保されません。

◇%n

%nは引数に整数へのポインタを使いまして、バッファ中に格納されている文字の数を数えて指定した整数変数へ値を格納します。よって画面に出力されません。

このへんかなり説明がややこしいし基本的にポインタを使うのでプログラム見ただけで理解するほうが大変かも。

ということで特別に番号つきでマガジン上でステップインしながらやりましょう。

#include<stdio.h>
main()
{
    int count=0;                              /* (1) */
    printf("C-Production%nNo.030\n",&count);  /* (2) */
    printf("%d\n",count);                     /* (3) */
}

結果:
C-ProductionNo.030
12

と出ました。それではステップインします。

まず(1)では変数の初期化を行っています。宣言だけで初期化しなかったらメモリを確保してもらえないからですね。

(2)で%nを使用しています。ここで大事なのは文字のカウントの対象となる部分がどこからどこまでかになります。
それは%nのある文字列の最初から%nの手前までです。
つまりプログラムではC-Productionになります。
この範囲では12文字あるので引数であるポインタを通して変数countに12を代入しています。

(3)最後に変数countを10進数表示したら12と表示されました。

と一連の動作はこのようになります。

昨日の%pと一緒にポインタも用意してサンプルプログラムを組んでみます。

#include<stdio.h>
main()
{
    int count=0;
    int *pointer;
    pointer=&count;

    printf("C-Production No.030%n\n",pointer);
    printf("上記の文字列の文字数は %d 文字です。\n",count);
    printf("ちなみに、変数countのアドレスは %p 番地です。\n",pointer);
}

実行結果:
C-Production No.030
上記の文字列の文字数は 19 文字です。
ちなみに、変数countのアドレスは 0065FDF4 番地です。

と表示されました。スペースもちゃんとカウントされていますね。
また全角文字の場合は全角1文字を2文字としてカウントします。