stdlib.h에 strtoi가없는 이유는 무엇입니까?
나는 익숙해 strtod
지고 변형되었습니다. stdlib.h와 함께 제공되는 strtoi가없는 이유가 궁금합니다. 정수가이 파티에서 제외되는 이유는 무엇입니까?
특히 strtod의 안전 기능을 가진 atoi 버전이없는 이유를 묻습니다.
strtol()
문자열을 정수, 긴 정수이지만 정수로 변환합니다. 있다 atoi()
하지만 그것 때문에 유효하지 않은 입력에서 오류보고하는 메커니즘을 결여 사실 대부분의 경우 피해야한다.
stdlib.h에 strtoi가없는 이유는 무엇입니까?
중요한 필요가 없습니다.
초기 C에서는 다음보다 더 넓은 표준 부호 유형이 없었으며 long
,와 같은 모든 좁은 변환은 아래와 같이 int
만들 수 있습니다 strtol()
.
IMO, 이것들과 그 unsigned
대응 물은 현재 C 기능과 현재 표준 C 라이브러리의 디자인 단점이 누락되었습니다.
많은 시스템에서 long
와 int
동일한 범위를 가지고 있으므로 별도의 감소 필요가있다 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
'IT TIP' 카테고리의 다른 글
Gradle이 두 개의 종속성에 대해 동일한 버전을 설정하도록 강제 할 수 있습니까? (0) | 2020.12.13 |
---|---|
파이썬 mock을 사용하여 함수 조롱 (0) | 2020.12.12 |
CSS2.1이 새 블록 서식 컨텍스트를 설정하기 위해 "표시"이외의 오버플로 값을 정의하는 이유는 무엇입니까? (0) | 2020.12.12 |
장고에서 부트 스트랩을 어떻게 사용할 수 있습니까? (0) | 2020.12.12 |
텍스트 영역 높이 : 100 % (0) | 2020.12.12 |