[英]Why is there no strtoi in stdlib.h?
我已經習慣了strtod
和變體。 我想知道為什么<stdlib.h>
沒有附帶strtoi
。 為什么 integer 類型被排除在此方之外?
具體來說,我問為什么沒有具有strtod
安全功能的atoi
版本?
strtol()
將字符串轉換為 integer、長 integer 但仍然是 integer。 有atoi()
但在大多數情況下應該避免使用它,因為它缺乏從無效輸入報告錯誤的機制。
為什么 stdlib.h 中沒有 strtoi?
沒有關鍵需求。
在早期的 C 中,沒有標准簽名的 integer 類型比long
更寬,所有更窄的轉換,如int
,都可以從strtol()
進行 - 如下所示。
IMO,這些及其unsigned
的對應物現在缺少 C 功能和當前標准 C 庫 (C17/18) 中的設計缺陷。
在許多系統上, long
和int
具有相同的范圍,因此減少了對單獨strtoi()
的需求。 atoi()
滿足了將快速和臟代碼轉換為int
的需求,但可能缺乏錯誤檢測或導致未定義行為(UB)。 也沒有strto_short()
或strto_signchar()
等。
創建替代strtoi()
相當容易。 存在簡化。
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
static long strto_subrange(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 strtoi(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) strto_subrange(s, endptr, base, INT_MIN, INT_MAX);
#endif
}
short strtoshort(const char *s, char **endptr, int base) {
return (short) strto_subrange(s, endptr, base, SHRT_MIN, SHRT_MAX);
}
signed char strtoschar(const char *s, char **endptr, int base) {
return (signed char) strto_subrange(s, endptr, base, SCHAR_MIN, SCHAR_MAX);
}
#include <stdint.h>
int16_t strtoint16(const char *s, char **endptr, int base) {
return (int16_t) strto_subrange(s, endptr, base, INT16_MIN, INT16_MAX);
}
integer 並沒有被排除在外:有strtol
,它將字符串轉換為long
,它是 integer 類型。
這是我一直在使用的。
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;
不要忽略手冊頁的SEE ALSO
部分:)
SEE ALSO atof(3), atoi(3), atol(3), strtol(3), strtoul(3)
您正在尋找atoi(3)
。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.