NeiNeigh's blog

覚書のようなブログ.PC・アプリケーション・プログラミング・オーディオ・アニメ

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言語の仕様とか全然把握してないんでわかりません.
どなたか教えてください.


コメントでこの記事に対する指摘を頂きました.
この問題は解決済みです.コメントを参照してください.