atol () 대 / 초 strtol ()
atol ()과 strtol ()의 차이점은 무엇입니까?
그들의 man 페이지에 따르면, 그들은 일치하는 인수뿐만 아니라 동일한 효과를 갖는 것으로 보입니다.
long atol(const char *nptr);
long int strtol(const char *nptr, char **endptr, int base);
일반화 된 경우 base
인수 를 사용하고 싶지 않을 때 (10 진수 만 있음) 어떤 함수를 사용해야합니까?
strtol
전체 문자열이 정수로 변환되었는지 여부를 실제로 알려줄 수 있으므로 더 많은 유연성을 제공합니다. atol
, 문자열을 숫자로 변환 할 수없는 경우 (에서와 같이 atol("help")
) 0을 반환하며 이는 다음과 구분할 수 없습니다 atol("0")
.
int main()
{
int res_help = atol("help");
int res_zero = atol("0");
printf("Got from help: %d, from zero: %d\n", res_help, res_zero);
return 0;
}
출력 :
Got from help: 0, from zero: 0
strtol
endptr
인수를 사용 하여 변환이 실패한 위치 를 지정 합니다.
int main()
{
char* end;
int res_help = strtol("help", &end, 10);
if (!*end)
printf("Converted successfully\n");
else
printf("Conversion error, non-convertible part: %s", end);
return 0;
}
출력 :
Conversion error, non-convertible part: help
따라서 진지한 프로그래밍의 경우 strtol
. 사용하기가 조금 더 까다 롭지 만 위에서 설명한 것처럼 좋은 이유가 있습니다.
atol
매우 간단하고 통제 된 경우에만 적합 할 수 있습니다.
atol
기능은 사용 가능한 오류 처리 기능 strtol
을 atol
제공하지 않는 경우를 제외하고 기능 의 하위 집합입니다 . ato...
함수 의 가장 두드러진 문제 는 오버플로의 경우 정의되지 않은 동작으로 이어진다는 것입니다. 참고 : 이는 오류 발생시 정보 피드백이 부족한 것이 아니라 정의되지 않은 동작 , 즉 일반적으로 복구 할 수없는 오류입니다.
이것은 atol
기능 (다른 모든 ato..
기능 과 마찬가지로 )이 심각한 실제 목적에 거의 쓸모가 없음을 의미합니다. 그것은 디자인 실수 였고 그 자리는 C 역사의 폐차장에 있습니다. strto...
변환을 수행하려면 그룹의 함수를 사용해야합니다 . 무엇보다도 ato...
그룹의 기능에 내재 된 문제를 해결하기 위해 도입되었습니다 .
atoi
man 페이지 에 따르면 strtol
.
IMPLEMENTATION NOTES
The atoi() and atoi_l() functions have been deprecated by strtol() and strtol_l()
and should not be used in new code.
새 코드에서는 항상 strtol
. 오류 처리 기능이 있으며 endptr
인수를 사용하면 문자열의 어느 부분이 사용되었는지 확인할 수 있습니다.
C99 표준은 ato*
기능 에 대해 다음과 같이 설명합니다 .
오류에 대한 동작을 제외하고는 다음과 같습니다.
atoi: (int)strtol(nptr,(char **)NULL, 10)
atol: strtol(nptr,(char **)NULL, 10)
atoll: strtoll(nptr, (char **)NULL, 10)
atol(str)
다음과 같다
strtol(str, (char **)NULL, 10);
Use strtol if you want the end pointer (to check whether there are more characters to read or if in fact you have read any at all) or a base other than 10. Otherwise, atol is fine.
If memory serves, strtol()
has the added benefit to set the (optional) endptr
to point to the first character that could not be converted. If NULL
, it is ignored. That way if you're processing a string containing numbers and characters mixed, you could continue.
e.g.,
char buf[] = "213982 and the rest";
char *theRest;
long int num = strtol(buf, &theRest, 10);
printf("%ld\n", num); /* 213982 */
printf("%s\n", theRest); /* " and the rest" */
The man page of strtol gives the following:
ERRORS
EINVAL (not in C99) The given base contains an unsupported value.
ERANGE The resulting value was out of range.
The implementation may also set errno to EINVAL in case no conversion was performed (no digits seen, and 0 returned).
The following code checks for range errors. (Modified Eli's code a bit)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main()
{
errno = 0;
char* end = 0;
long res = strtol("83459299999999999K997", &end, 10);
if(errno != 0)
{
printf("Conversion error, %s\n", strerror(errno));
}
else if (*end)
{
printf("Converted partially: %i, non-convertible part: %s\n", res, end);
}
else
{
printf("Converted successfully: %i\n", res);
}
return 0;
}
참고URL : https://stackoverflow.com/questions/3792663/atol-v-s-strtol
'development' 카테고리의 다른 글
Rails에서 사용자 지정 유효성 검사 메서드 호출 (0) | 2020.12.07 |
---|---|
C ++의 꼬리 재귀 (0) | 2020.12.07 |
SQL의 여러 내부 조인을 LINQ로 어떻게 변환합니까? (0) | 2020.12.07 |
SCM에서 Maven 프로젝트 확인-커넥터 없음 (0) | 2020.12.07 |
NSURL 경로와 absoluteString (0) | 2020.12.07 |