strtod関数はdouble型の浮動小数点実数に、strtol関数はlong int型整数に、strtoul関数はunsigned long int型整数に、文字列を変換します。

変換する文字列が’0x’で始まる場合は十六進数として、’0’で始まる場合は八進数として取り扱われます。また、数値に変換できない文字があった場合は、その時点で終了します。

#include <stdlib.h>
double strtod(const char *nptr, char **endptr);
long int strtol(const char *nptr, char **endptr, int base);
unsigned long int strtoul(const char *nptr, char **endptr, int base);

*nptrは数値に変換する文字列を指定します。
**endptrは数値に変換できない文字のアドレスを格納する領域を(アドレスで)指定します。NULLを指定することもできます。
baseは変換する数値の基数を2から32までの値で指定します。0を指定した場合は、八進数、十進数、十六進数として取り扱います。

戻り値として、変換結果を返します。オーバーフローまたは、アンダーフローを起こした場合には、次の値が返ります。

strtod関数
オーバーフローを起こした場合にはプラスまたは、マイナスのHUGE_VALが、アンダーフローを起こした場合には0が返ります。また、大域変数errnoにERANGEが設定されます。
strtol関数
オーバーフローを起こした場合にはLONG_MAXLが、アンダーフローを起こした場合にはLONG_MINが返ります。また、大域変数errnoにERANGEが設定されます。
strtoul関数
オーバーフローを起こした場合にはULONG_MAXが返ります。また、大域変数errnoにERANGEが設定されます。

戻り値を見ても、正常に変換できたのかを判断しにくいため、実行前に大域変数errnoに0を設定しておき、実行後に0かどうかにより判断することもできます。

第2引数の*endptrがNULLでない場合は、最初に現れた不正な文字のアドレスがここに保存されています。文字列に有効な数字がひとつもなければ第1引数の*nptrの元の値を*endptrに設定します。(戻り値は0です。)関数実行後、*nptrが’\0’以外で、**endptrが’\0’ならば、文字列全体が有効だったことになります。

プログラム 例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main()
{
  char   *StrChomp(char *);       /* 改行削除 */
  char   buff[100];
  long   value;
  char   *endptr;

  while(1) {
    printf('整数値に変換する文字列を入力してください ==> ');
    fgets(buff, 100, stdin);
    StrChomp(buff);

    if (strcmp(buff, 'end') != 0) {
      errno = 0;             /* 大域変数errnoに0を設定 */
      /* 文字列をlong int型に変換 */
      value = strtol(buff, &endptr, 0);
      /* 完全に変換できたかのチェック */
      if ((errno != 0) || (*endptr != '\0')) {
        printf('変換できませんでした\n');
      }
      else {
        printf('%s --> %ld\n', buff, value);
      }
    }
    else {
      break;
    }
  }

  return 0;
}

/* 改行削除 */
char *StrChomp(char *str)
{
  char   *str_p;;

  for (str_p = str; *str_p; ++str_p)
    ;

  if (*(str_p - 1) == '\n') {
    *(str_p - 1) = '\0';
  }

  return str;
}

例の実行結果

$ ./strtox.exe
整数値に変換する文字列を入力してください ==> 1234
1234 --> 1234
整数値に変換する文字列を入力してください ==>   +1234
  +1234 --> 1234
整数値に変換する文字列を入力してください ==> -1234
-1234 --> -1234
整数値に変換する文字列を入力してください ==> 12.34
変換できませんでした
整数値に変換する文字列を入力してください ==> 0xf
0xf --> 15
整数値に変換する文字列を入力してください ==> 0XB
0XB --> 11
整数値に変換する文字列を入力してください ==> 07
07 --> 7
整数値に変換する文字列を入力してください ==> 017
017 --> 15
整数値に変換する文字列を入力してください ==> 1a2
変換できませんでした
整数値に変換する文字列を入力してください ==> *12
変換できませんでした
整数値に変換する文字列を入力してください ==>    1 2 3
変換できませんでした
整数値に変換する文字列を入力してください ==> 2000000000
2000000000 --> 2000000000
整数値に変換する文字列を入力してください ==> -2000000000
-2000000000 --> -2000000000
整数値に変換する文字列を入力してください ==> 2222222222
変換できませんでした
整数値に変換する文字列を入力してください ==> end
$