snprintf の戻り値

C99 規格で定義されている snprintf は、二番目の引数でバッファサイズを受け取る。その戻り値はバッファサイズを超えうる、ということを昨日知った。というのは、戻り値はフォーマットした結果あるべき出力結果の文字列長さを返すから。

つまり、次のソースをコンパイルして実行すると OK が出力される。

#include <stdio.h>
#include <string.h>

int main()
{
  char buf[8];
  const int len = snprintf(buf, 8u, "%s world", "hello");
  puts(11 == len && 7u == strlen(buf) ? "OK" : "NG");
  return 0;
}

上述のコードで snprintf により整形した結果文字列は "hello world" となるはずで、この文字列長は 11。しかしバッファーサイズは 8 なので生計結果の先頭からの 7 文字に終端ヌル文字を加えた結果がバッファーに格納されることになるってわけ。

ヒアドキュメントを使ってコマンドラインでソース入力・コンパイル・実行した例 (キーワードハイライトが効かないから読みにくいね):

$ gcc -o test -xc -<< EOF && ./test
> #include <stdio.h>
> #include <string.h>
> 
> int main()
> {
>   char buf[8];
>   const int len = snprintf(buf, 8u, "%s world", "hello");
>   puts(11 == len && 7u == strlen(buf) ? "OK" : "NG");
>   return 0;
> }
> EOF
OK