programing

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

sourcetip 2022. 7. 15. 23:16
반응형

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

에 익숙해졌다.strtod및 바리안트.왜 없을까?strtoi출하된<stdlib.h>왜 정수형은 이 파티에서 제외되는 거죠?

특히, 왜 버전이 없는지를 묻고 있습니다.atoi안전상의 특징과 함께strtod?

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

중요한 것은 없습니다.

초기 C에서는 다음보다 넓은 표준 부호 정수형이 없었습니다.long더 좁은 변환도 가능하죠int, 로 만들 수 있습니다.strtol()- 아래와 같습니다.

이것과 그 것unsigned현재 표준 C 라이브러리(C17/18)에 C 기능과 설계 단점이 없습니다.


많은 시스템에서long그리고.int같은 범위를 가지기 때문에 분리 필요성이 감소한다.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.

로 시작하는 함수 이름str,mem, 또는wcs및 소문자를 의 선언문에 추가할 수 있습니다.<string.h>header를 클릭합니다.C17dr © 7.31.13 1

strtol()는 문자열을 정수, 긴 정수로 변환하지만 그래도 정수로 변환합니다.있어atoi()단, 무효 입력으로부터의 에러 리포트 메커니즘이 없기 때문에 대부분의 경우 피해야 합니다.

이게 제가 쓰던 거예요.

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;

파티에는 정수가 빠지지 않습니다.strtol이 명령어를 사용하여 스트링을long정수형입니다.

전화입니다. 자세한 내용은 Wikipedia도 참조해 주세요.후계 프로그램도 포함됩니다.strol.

간과하지 마세요.SEE ALSO를 참조해 주세요.

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

당신이 찾고 있는 것은atoi(3). :)

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

반응형