sprintf()とsnprintf()の違い(?)
両者の違いでぐぐると,snprintf()ならバッファオーバーフロを防げるよってことが書いてあるページが多い.でも,使ってたらこんな違いもあったらメモする.
コメントでこの記事に対する指摘を頂きました.
この問題は解決済みです.コメントを参照してください.
ソースコード
とりあえずソースコードはこれ.
#include <stdio.h> #include <stdint.h> int main(){ char str[128]; uint64_t uint64 = 100; str[0] = '\0'; sprintf(str, "%llo", (unsigned long long)uint64); printf("sprintf :%s\n", str); str[0] = '\0'; snprintf(str, sizeof(str), "%llu", (unsigned long long)uint64); printf("snprintf :%s\n", str); return 0; }
uint64_t型(unsigned long long)の変数に100をいれて,それをstringに変換するプログラム.
出力結果はどちらも100であることが期待される.
途中の'\0'の代入は初期化のつもり.これで十分な初期化ができてるかどうかはわからない.ちゃんと全部0で埋めたほうがいいのかも.
実行結果
実行するとこうなる.
sprintf :144 snprintf :100
わけわかんない.sprintf()のほうがおかしい.増えてる.
考察
ちょっとぐぐったけどよくわかんない.
自分の勝手な推測だと,unsigned long long型が登場したのはC99からで,
そしてそのときsnprintf()も実装された.
だからsnprintf()はformatの %llu に対応してるけど,
sprintf()は環境によっては上手くいかないのではないかなぁと.
正直C言語の仕様とか全然把握してないんでわかりません.
どなたか教えてください.
コメントでこの記事に対する指摘を頂きました.
この問題は解決済みです.コメントを参照してください.