programing

atoi vs atol vs strtol vs strtoul vs sscanf

starjava 2023. 9. 19. 20:40
반응형

atoi vs atol vs strtol vs strtoul vs sscanf

구문 분석 중인 명령줄에서 10진수, 16진수, 8진수 중 어떤 함수를 다음 함수로 변환하는 것이 가장 좋은지 알아보려고 합니다.int사전에 입력을 알지 못한 상태에서 best를 선택할 수 있습니다.

그러면 서로 다른 유형의 입력을 인식하고 이를 정수에 할당하는 단일 함수를 사용하는 것이 목표입니다.int) 값을 사용하면 다음과 같습니다.

./a.out 23 0xC4 070

could print

23
196 /*hexadecimal*/
56  /*octal*/

The only issue that I can see is the parsing to find the difference between a decimal integer and an octal.

Side question, is this stable for converting the string to an integer for use?

어떤 함수가 10진수, 16진수, 또는 8진수를 a로 변환하는 것이 가장 좋을까요?int으뜸(?)

해당 텍스트를 다음으로 변환하려면 다음과 같이 하십시오.int,권고한다.long strtol(const char *nptr, char **endptr, int base);로 변환할 때 추가 테스트와 함께int, 필요하면

사용하다0처럼base조향 변환의 초기 문자를 기본 10, 16 또는 8로 평가합니다.
@마이크 홀트

Convert text per:
Step 1: Optional whitespaces like `' '`, tab, `'\n'`, ... .
Step 2: Optional sign: `'-'` or `'+'`.
Step 3:
  0x or 0X followed by hex digits--> hexadecimal  
  0 --> octal  
  else --> decimal  

Sample code

#include <errno.h>
#include <limits.h>
#include <stdlib.h>

int mystrtoi(const char *str) {
  char *endptr;
  errno = 0;
  //                                   v--- determine conversion base
  long long_var = strtol(str, &endptr, 0);
  //   out of range   , extra junk at end,  no conversion at all   
  if (errno == ERANGE || *endptr != '\0' || str == endptr) {
    Handle_Error();
  }

  // Needed when `int` and `long` have different ranges
  #if LONG_MIN < INT_MIN || LONG_MAX > INT_MAX
  if (long_var < INT_MIN || long_var > INT_MAX) {
    errno = ERANGE;
    Handle_Error();
  }
  #endif

  return (int) long_var;
}

atoi vs atol vs strtol vs strtoul vs sscanf ... to int

atoi()
찬성: 아주 간단합니다.
프로: 다음으로 변환int.
프로: C 표준 라이브러리에서.
프로: 빠릅니다.
반대: 범위를 벗어난 오류, 정의되지 않은 동작.@chqrlie
반대: 16진수도 8진수도 처리하지 마십시오.

atol()
찬성: 간단합니다.
프로: C 표준 라이브러리에서.
프로: 빠릅니다.
Con: 다음으로 변환long,것은 아니다.int크기가 다를 수 있습니다.
반대: 범위를 벗어난 오류, 정의되지 않은 동작.
반대: 16진수도 8진수도 처리하지 마십시오.

strtol()
찬성: 간단합니다.
프로: C 표준 라이브러리에서.
프로: 좋은 오류 처리.
프로: 빠릅니다.
Pro: 바이너리 처리 가능. (베이스 2~베이스 36)
반대: 다음으로 변환long,것은 아니다.int크기가 다를 수 있습니다.

strtoul()
찬성: 간단합니다.
프로: C 표준 라이브러리에서.
프로: 좋은 오류 처리.
프로: 빠릅니다.
프로: 바이너리 처리 가능.
---: 음수에 대해 불평하지 않습니다.
Con: 다음으로 변환unsigned long,것은 아니다.int크기가 다를 수 있습니다.

sscanf(..., "%i", ...)
프로: C 표준 라이브러리에서.
프로: 로 변환int.
---: 중간 단계의 복잡성.
반대: 잠재적으로 느릴 수 있습니다.
Con: OK 오류 처리(오버플로우가 정의되지 않음).

모든 고통/혜택을 받음locale설정.§7.22.1.46 "C 로케일 이외의 추가적인 로케일 특정 주제 시퀀스 양식을 허용할 수 있습니다."


추가 크레딧:
@조나단 레플러:errno을 시험해 ERANGE,atoi() 약 당,errno다중 thread 우려 사항
@마리안 스피드 문제.
@케빈 라이브러리 포괄성.


.short,signed char, 등을 고려해 봅니다.

입니다를 할 뿐입니다.strtol()그리고.strtoul()(또는strtoll()아니면strtoull()<stdlib.h>, ,strtoimax()아니면strtoumax()<inttypes.h>이 있는 오류 상태에 관심이 있는 경우.오버플로에 대한 오류 조건을 신경쓰지 않는다면 어느 것이든 사용할 수 있습니다.둘 다 아니다.atoi()도 아니다atol()도 아니다sscanf()값이 오버플로되는 경우 제어할 수 있습니다.으로도,으로도.atoi()도 아니다atol()는 육각형 또는 팔각형 입력을 지원합니다(실제로 이러한 입력을 사용하여 요구 사항을 충족할 수 없음).

하십시오에 하는 것에 합니다.strtoX()함수들이 전적으로 사소한 것은 아닙니다.다를 .errno전화를 걸기 전에 0으로 설정하고 포인터를 전달하여 종료 위치를 파악한 후 주의 깊게 분석하여 무슨 일이 일어났는지 확인합니다.할 수 모든 errno그리고 엔드 포인터는 그들 모두를 구별하는 데 도움이 됩니다.

해야 하는 int를 들어, 후strtoll()를 들어 a, (저장된 에서))를 할 수 .long long 에 설명합니다.<limits.h>위해서int:INT_MIN그리고.INT_MAX.

자세한 내용은 의 올바른 사용 방법을 참조하십시오.

어떤 변환을 사용했는지 알 수 있는 함수는 없습니다.당신이 직접 그 끈을 분석해야 할 것입니다. C 있었나요?트를 쓸때: C법 0요;때.0를 쓰고 번째 a, 이므로(는 입니다)0이 것에 인 결과는 이 사소한 것에 실질적인 결과는 없습니다.

언급URL : https://stackoverflow.com/questions/22865622/atoi-vs-atol-vs-strtol-vs-strtoul-vs-sscanf

반응형