programing

atoi : 0과 에러의 차이를 식별하는 방법

goodcopy 2022. 7. 3. 23:24
반응형

atoi : 0과 에러의 차이를 식별하는 방법

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

반환값

성공 시 함수는 변환된 정수 값을 반환한다.int값. 유효한 변환을 수행할 수 없는 경우 0 값이 반환됩니다.올바른 값이 표시 가능한 값의 범위를 벗어나면 INT_MAX 또는 INT_MIN이 반환됩니다.

그래서 내가 어떻게 다른지atoi("poop")그리고.atoi("0")그리고.atoi("0000000")

네, 0의 결과가 나올 경우에 대비하여 루프하여 모두 0을 확인할 수 있습니다만, 더 좋은 방법은 없습니까?

주의: ANSI C89를 사용하고 있습니다.

그게 이유 중 하나야atoi안전하지 않은 것으로 여겨지기도 합니다.사용하다strtol/strtoul대신.또, 사용하고 있는 경우는, 을 사용해 주세요.

함수atoi당신이 생각하는 것보다 더 위험합니다.표준에는 다음과 같이 기술되어 있습니다.

값을 나타낼 수 없는 경우 동작은 정의되지 않습니다.

C99 규격에서는, 다음과 같이 기술하고 있습니다.

7.20.1

atof, atoi, atol 및 환초 함수는 오류에 대한 정수식 errno 값에 영향을 줄 필요는 없습니다.결과 값을 나타낼 수 없는 경우 동작은 선언되지 않습니다.

@cnicutar 및 @ouah에서 설명한 바와 같이atoi유효한 0과 비활성 문자열을 구분할 수 없습니다.strtol가족의 더 나은 선택지.

하지만? 어떻게?먼저 이해해야 할 것은 두 가지 모두atoi그리고.strtol는 문자열의 첫 번째 숫자 집합만 숫자 값으로 변환합니다.뒤에 오는 숫자가 아닌 문자는 무시됩니다. strtol는 비활성 문자열 확인에 사용할 수 있습니다.숫자 값 외에 문자열의 숫자 부분 끝에 포인터가 반환되기 때문입니다.따라서 이 경우end포인터는 원래 문자열의 시작을 나타냅니다.오류가 발생하여 문자열의 문자가 변환되지 않았음을 알 수 있습니다.

코드 예에서 볼 수 있듯이 기타 몇 가지 하위 항목이 있습니다.

long lnum;
int num;
char *end;

errno = 0;

lnum = strtol(in_str, &end, 10);        //10 specifies base-10
if (end == in_str)     //if no characters were converted these pointers are equal
    fprintf(stderr, "ERROR: can't convert string to number\n");

//If sizeof(int) == sizeof(long), we have to explicitly check for overflows
if ((lnum == LONG_MAX || lnum == LONG_MIN) && errno == ERANGE)  
    fprintf(stderr, "ERROR: number out of range for LONG\n");

//Because strtol produces a long, check for overflow
if ( (lnum > INT_MAX) || (lnum < INT_MIN) )
    fprintf(stderr, "ERROR: number out of range for INT\n");

//Finally convert the result to a plain int (if that's what you want)
num = (int) lnum;

주의: 입력 문자열이 유효한 int 범위 내에 있다고 확신하는 경우,lnum스트롤의 귀환을 직접 캐스팅하면 됩니다.num = (int) strtolen(in_str, &end, 10);

할 수 없어요.

atoi에러를 검출할 수 없습니다.결과를 표현할 수 없다면atoi정의되지 않은 동작을 호출합니다.사용하다strtol대신atoi.

안전한 CERT 코딩 사용 권장strtol대신atoi, 읽기:

INT06-Cstrtol() 또는 관련 함수를 사용하여 문자열 토큰을 정수로 변환합니다.

언급URL : https://stackoverflow.com/questions/8871711/atoi-how-to-identify-the-difference-between-zero-and-error

반응형