IT TIP

stdlib.h에 strtoi가없는 이유는 무엇입니까?

itqueen 2020. 12. 12. 12:56
반응형

stdlib.h에 strtoi가없는 이유는 무엇입니까?


나는 익숙해 strtod지고 변형되었습니다. stdlib.h와 함께 제공되는 strtoi가없는 이유가 궁금합니다. 정수가이 파티에서 제외되는 이유는 무엇입니까?

특히 strtod의 안전 기능을 가진 atoi 버전이없는 이유를 묻습니다.


strtol()문자열을 정수, 긴 정수이지만 정수로 변환합니다. 있다 atoi()하지만 그것 때문에 유효하지 않은 입력에서 오류보고하는 메커니즘을 결여 사실 대부분의 경우 피해야한다.


stdlib.h에 strtoi가없는 이유는 무엇입니까?

중요한 필요가 없습니다.

초기 C에서는 다음보다 더 넓은 표준 부호 유형이 없었으며 long,와 같은 모든 좁은 변환은 아래와 같이 int만들 수 있습니다 strtol().

IMO, 이것들과 그 unsigned대응 물은 현재 C 기능과 현재 표준 C 라이브러리의 디자인 단점이 누락되었습니다.


많은 시스템에서 longint동일한 범위를 가지고 있으므로 별도의 감소 필요가있다 strtoi(). 또한 atoi()빠르고 더러운 코드에 대한 필요성을 충족하지만 오류 감지가 부족할 수 있습니다. 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);
}

정수는 파티에서 제외되지 않습니다 strtol. 문자열을 long정수 유형 인으로 변환하는 이 있습니다.


이것이 제가 사용해온 것입니다.

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). :)


It's call atoi. See also Wikipedia for details, including its successor strol.

참고URL : https://stackoverflow.com/questions/6181432/why-is-there-no-strtoi-in-stdlib-h

반응형