development

atol () 대 / 초

big-blog 2020. 12. 7. 20:14
반응형

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

strtolendptr인수를 사용 하여 변환이 실패한 위치 를 지정 합니다.

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기능은 사용 가능한 오류 처리 기능 strtolatol제공하지 않는 경우를 제외하고 기능 의 하위 집합입니다 . ato...함수 의 가장 두드러진 문제 는 오버플로의 경우 정의되지 않은 동작으로 이어진다는 것입니다. 참고 : 이는 오류 발생시 정보 피드백이 부족한 것이 아니라 정의되지 않은 동작 , 즉 일반적으로 복구 할 수없는 오류입니다.

이것은 atol기능 (다른 모든 ato..기능 과 마찬가지로 )이 심각한 실제 목적에 거의 쓸모가 없음을 의미합니다. 그것은 디자인 실수 였고 그 자리는 C 역사의 폐차장에 있습니다. strto...변환을 수행하려면 그룹의 함수를 사용해야합니다 . 무엇보다도 ato...그룹의 기능에 내재 된 문제를 해결하기 위해 도입되었습니다 .


atoiman 페이지 에 따르면 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

반응형