strtold (C99)

文字列を long double 型に変換します.

#include <stdlib.h>
long double strtold(
    const char * restrict nptr,
    char ** restrict endptr
);

strtold 関数は引数 nptr が指す文字列のはじめの数字の部分を long double 型の表現に変換します.nptr が指す文字列中に変換不可能な文字があった場合には,その文字列へのポインタを endptr に格納します.

機能がよく似た関数に strtodstrtof があります.

引数

  • nptr: 変換する文字列 (認識可能な形式は以下の通りです ※1)
    • [符号(+ or -)] 空でない 10 進数字の列 [指数部]
    • [符号(+ or -)] 空でない 16 進数の列 [2 進指数部]
    • [符号(+ or -)] INF or INFINITY
    • [符号(+ or -)] NAN or NAN (n 文字列 ※3)
  • endptr: 変換出来ない文字列を格納 ※2

※1 [ ] で囲まれたところは省略可能です.

※2 空ポインタ (NULL) を指定した場合は格納されません.

※3 n 文字列 に指定できるのは以下の形式です.

  1. 数字
  2. 非数字
  3. n 文字列 数字
  4. n 文字列 非数字

戻り値

  • 変換が可能な場合: 変換した値
  • 変換が不可能な場合: 0
  • 正しい値が表現可能な値の範囲外の場合: 正または負の HUGE_VAL (errno に ERANGE の値を格納)
  • 正しい値がアンダーフローを起こす場合: long double 型で最も小さな正規化された正の数以下の絶対値をもつ値

C言語サンプルプログラム

strtold 関数を用いたサンプルプログラムを以下に示します.以下のサンプルプログラムでは fgets を用いて標準入力から文字列を取得し,それを strtold で long double 型に変換しています.

/* header files */
#include <stdio.h>
#include <stdlib.h>

/* macros */
#define N 256

/* main */
int main(void) {
    char s[N] = {'\0'}, *endptr;
    long double x;

    /* 入力 */
    fgets(s, N, stdin);
    printf("変換前: %s", s);

    /* 変換 */
    x = strtold(s, &endptr);

    /* 結果を表示 */
    printf("変換後: %.2Lf\n", x);
    printf("endptr の値: %s\n", endptr);

    return EXIT_SUCCESS;
}

実行例

サンプルプログラムの実行結果は以下のようになります.

( 3.14 を入力 )
変換前: 3.14
変換後: 3.14
endptr の値: 

( 10hoge を入力 )
変換前: 10hoge
変換後: 10.00
endptr の値: hoge

( hoge10 を入力 )
変換前: hoge10
変換後: 0.00
endptr の値: hoge10

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.