簡體   English   中英

為什么 stdlib.h 中沒有 strtoi?

[英]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) 中的設計缺陷。


在許多系統上, longint具有相同的范圍,因此減少了對單獨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;

它叫atoi 另請參閱Wikipedia了解詳細信息,包括其繼任者strol

不要忽略手冊頁的SEE ALSO部分:)

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

您正在尋找atoi(3) :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM