Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のprintf()における%n書式指定子とは?出力文字数を格納する特殊な機能を解説

C言語のprintf()における%n書式指定子とは?

C言語には、%nという特殊な書式指定子が用意されています。一般的な書式指定子(%d%sなど)が画面へ値を出力するのに対し、%nは何も出力しません。その代わり、対応する引数として渡されたポインタが指し示す変数に、「%nが出現するまでにprintf()が出力した文字数」を格納します。

ポイント: %n自体は画面に何も表示しません。文字列の出力には、別途printf()関数を呼び出して行います。

基本的な使用例

#include<stdio.h>
int main() {
    int s;
    printf("The value of %ns : ", &s);
    printf("%d", s);
    getchar();
    return 0;
}

実行結果

The value of s : 13

この例では、変数sに初期値を与えていないにもかかわらず、出力結果は「13」となります。%nはプログラマが設定した値を無視し、書式文字列内で%nより前に出力された文字数をカウントして格納するためです。なお、%n自体は1文字としてカウントされません。

この場合、「The value of 」の13文字(空白を含む)が変数sに格納されています。

複数の%nを使った例

次に、1つの書式文字列の中で複数の%nを使用した例を見てみましょう。

#include<stdio.h>
int main() {
    int s;
    int m = 28;
    int val;
    printf("The value of %ns and %nm %nval : ", &s, &m, &val);
    printf("%d\t%d\t%d", s, m, val);
    return 0;
}

実行結果

The value of s and m val : 131921

変数mには28という値を代入していますが、出力結果には反映されていません。これは、各%nがそれぞれ自分より前に出力された文字数で変数の内容を上書きするためです。

  • s = 13:「The value of 」までの13文字
  • m = 19:「The value of s and 」までの19文字
  • val = 21:「The value of s and m 」までの21文字

セキュリティに関する注意点

%nは、メモリ上の変数へ値を書き込むことができる唯一の書式指定子であるため、取り扱いには十分な注意が必要です。ユーザーからの入力を直接書式文字列としてprintf()に渡すと、「フォーマット文字列攻撃」と呼ばれる深刻な脆弱性につながる恐れがあります。実際の開発では%nの使用は極力避け、特別な理由がある場合に限定して利用することをおすすめします。

  1. C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説

    問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ

  2. JavaのStrictMathクラスとは?主なメソッドと使い方を解説

    java.lang.StrictMathはfinalクラスであり、Objectクラスのサブクラスです。このクラスには、指数関数・対数関数・平方根や三角関数といった初等的な数値演算を実行するためのメソッドが多数含まれています。 StrictMathクラスのすべてのメソッドはstaticメソッド(静的メソッド)として定義されているため、インスタンスを生成する必要はありません。クラス名を直接指定してメソッドを呼び出すだけで利用できます。 主なメソッド一覧 StrictMathクラスでよく使われるメソッドには以下のようなものがあります。 abs():絶対値を返す acos() / asin()