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 |