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
'programing' 카테고리의 다른 글
created() 라이프 사이클훅의 vue 비동기 호출 (0) | 2022.07.15 |
---|---|
스프링 부트 및 여러 외부 구성 파일 (0) | 2022.07.15 |
동작의 Axios 데이터와 함께 컴포넌트에서 Vuex getter 사용 (0) | 2022.07.15 |
Axios 기본 헤더를 전체적으로 수정할 때 문제 발생 - Vue (0) | 2022.07.15 |
Vuex, 비동기 콜의 베스트 프랙티스는 무엇입니까? (0) | 2022.07.15 |