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