実数を文字列に変換する | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

「12.3」「-12.3」のような実数を文字列に変換したいとします。

方法①(snprintf関数を使う)

C言語の標準ライブラリの snprintf関数を利用できます。

#include <stdio.h>

int main(void)
{
    char s[32];

    snprintf(s, sizeof(s), "%lf", 12.3);
    puts(s);

    snprintf(s, sizeof(s), "%lf", -12.3);
    puts(s);

    snprintf(s, sizeof(s), "%+lf", +12.3);  // +符号を付けたい場合
    puts(s);
}

実行結果:

12.300000
-12.300000
+12.300000

実数の型が double型や float型の場合は、%f変換を使って、整数を文字列化します(C99 からは double型に %lf を使っても同じ結果になります)。long double型の場合は、“%Lf” になります。

また、実数の定数を「+12.3」のように表記できるので、変換後の文字列にも符号をきちんと付けたいのなら、「%+f」のように「+」を挟み込んでください。

変換結果の下位の方につく「0」が気になるところです。精度の指定を加えることで対応できますが、桁数が分かっていないといけないので、柔軟な対応は難しいです。

#include <stdio.h>

int main(void)
{
    char s[32];

    snprintf(s, sizeof(s), "%2.1f", 12.3);
    puts(s);

    snprintf(s, sizeof(s), "%2.1f", -12.3);
    puts(s);

    snprintf(s, sizeof(s), "%+2.1f", +12.3);  // +符号を付けたい場合
    puts(s);
}

実行結果:

12.3
-12.3
+12.3

snprintf関数の戻り値を調べることで、配列の大きさが不足して、文字列が途中で途切れていないかどうかを知ることができます。少々、面倒になりますが、たとえば以下のように書けます。

#include <stdio.h>

int main(void)
{
    char s[2];

    int n = snprintf(s, sizeof(s), "%lf", 12.3);
    if (n < 0) {
        fputs("error\n", stderr);
    }
    else if (n < sizeof(s)) {
        puts(s);
    }
    else {
        printf("%s (truncated)\n", s);
    }

    n = snprintf(s, sizeof(s), "%lf", -12.3);
    if (n < 0) {
        fputs("error\n", stderr);
    }
    else if (n < sizeof(s)) {
        puts(s);
    }
    else {
        printf("%s (truncated)\n", s);
    }

    n = snprintf(s, sizeof(s), "%+f", +12.3);  // +符号を付けたい場合
    if (n < 0) {
        fputs("error\n", stderr);
    }
    else if (n < sizeof(s)) {
        puts(s);
    }
    else {
        printf("%s (truncated)\n", s);
    }
}

実行結果:

1 (truncated)
- (truncated)
+ (truncated)

戻り値が、第2引数に指定した大きさ以上だった場合、配列が不足しています。その場合でも、終端の ‘\0’ はきちんと付加されるので、最低限の動作という面では安全ですが、意図どおりの結果を得られていない訳なので、注意が必要です。


参考リンク


更新履歴

’2018/4/5 VisualStudio 2013 の対応終了。

’2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

’2017/7/21 「方法③」の内容を、_snprintf関数を使う例から _snprintf_s関数を使う例に修正した。

’2017/6/15 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る