snprintf関数 - フォーマット文字列を文字列変数へ出力(最大文字数制限あり)

snprintf関数は、機能はsprintf関数と同じですが、最大文字数を指定できます。バッファオーバーランを確実に防ぎたい場合に、利用できます。snprintf関数は、stdio.hを読み込むと利用できます。

#include <stdio.h>
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);

第二引数で最大文字数(文字列終端のヌル文字「\0」を含んだ文字数なので、実質的には「n - 1」)を指定できる以外は、sprintf関数と同じです。文字数が「n - 1」を超えた場合は、それ以降の文字列は書きこまれず、ヌル文字「\0」が書き込まれます。

snprintf関数のサンプル

snprintf関数のサンプルです。

#include <stdio.h>
#include <stdint.h>

int main(void) {
  const char* name = "long_long_long_name";
  int32_t age = 40;
  
  char message[16];
  
  // 最大文字数を制限しているので、バッファオーバーランは起きない
  snprintf(message, 16, "I'm %s. Age is %d.", name, age);
  
  printf("%s\n", message);
}

出力結果です。出力が欠けています。

I'm long_long_l

バッファオーバーランは起こりませんが、プログラム的には、おそらくこれは正しい結果ではないので、バッファの長さを伸ばすなど、プログラムを修正する必要がある可能性が高いです。

関連情報