70

strtod私はバリアントに慣れてきました。なぜstrtoi同梱がないのか不思議です<stdlib.h>。整数型がこのパーティーから除外されているのはなぜですか?

atoi具体的には、安全機能を備えた のバージョンがない理由を尋ねていstrtodます。

4

6 に答える 6

50

strtol()文字列を整数に変換します。長整数ですが、それでも整数です。ありますがatoi()、無効な入力からのエラー報告のメカニズムがないため、ほとんどの場合は避ける必要があります。

于 2011-05-30T23:09:18.570 に答える
39

stdlib.h に strtoi がないのはなぜですか?

重要な必要はありません。

初期の C では、 より広い標準の符号付き整数型はなく、 のlongようなすべての狭い変換は、以下で行うように -intから行うことができました。strtol()

IMO、これらとそのunsigned対応物には、現在の標準 C ライブラリ (C17/18) の C 関数と設計上の欠点がありません。


多くのシステムでは、longintの範囲は同じであるため、別のstrtoi(). atoi()に変換するための迅速で汚いコードの必要性を満たしますが、intエラー検出が欠けている可能性があります。エラーが発生すると、atoi()未定義の動作(UB) が発生します。などもありませstrto_short()strto_signchar()

代用を作成するのはかなり簡単strtoi()です。単純化が存在します。

#include <errno.h>
#include <limits.h>
#include <stdlib.h>

static long str2subrange(const char *s, char **endptr, int base, 
    long min, long max) {
  long y = strtol(s, endptr, base);
  if (y > max) {
    errno = ERANGE;
    return max;
  }
  if (y < min) {
    errno = ERANGE;
    return min;
  }
  return y;
}

// OP's goal
int str2i(const char *s, char **endptr, int base) {
  #if INT_MAX == LONG_MAX && INT_MIN == LONG_MIN
    return (int) strtol(s, endptr, base);
  #else
    return (int) str2subrange(s, endptr, base, INT_MIN, INT_MAX);
  #endif
}

short str2short(const char *s, char **endptr, int base) {
  return (short) str2subrange(s, endptr, base, SHRT_MIN, SHRT_MAX);
}

signed char str2schar(const char *s, char **endptr, int base) {
  return (signed char) str2subrange(s, endptr, base, SCHAR_MIN, SCHAR_MAX);
}

#include <stdint.h>
int16_t str2int16(const char *s, char **endptr, int base) {
  return (int16_t) str2subrange(s, endptr, base, INT16_MIN, INT16_MAX);
}

[2021年編集]

将来のライブラリの指示との競合を避けるために、名前が からstrto...()に変更されましたstr2...()
2暗示to

strmem、またはwcs小文字で始まる関数名は、<string.h>ヘッダーの宣言に追加できます。C17dr § 7.31.13 1

于 2015-03-31T20:54:39.687 に答える
3

整数はパーティから除外されません:文字列を整数型でstrtolある に変換する があります。long

于 2011-05-30T23:01:31.780 に答える
2

これは私が使ってきたものです。

long long_val;
int  int_value;

errno = 0;
long_val = strtol (theString, NULL, 10);
if (errno)
   handle_error;
if ((long) someIntMin > long_val || long_val > (long) someIntMax)
   handle_invalid;
int_value = (int) long_val;
于 2013-09-08T20:02:15.347 に答える
-4

コールatoiです。後継者を含む詳細については、ウィキペディアも参照してくださいstrol

于 2011-05-30T22:59:49.793 に答える
-4

SEE ALSOあなたのマンページのセクションを見落とさないでください:)

SEE ALSO
       atof(3), atoi(3), atol(3), strtol(3), strtoul(3)

を探していatoi(3)ます。:)

于 2011-05-30T23:01:47.333 に答える