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
'programing' 카테고리의 다른 글
어레이의 모든 멤버를 동일한 값으로 초기화하려면 어떻게 해야 합니까? (0) | 2022.07.05 |
---|---|
Vue-CLI로 만든 앱으로 404 페이지 제공 (0) | 2022.07.03 |
사용자를 다른 페이지로 보내는 것을 중지하려면 어떻게 해야 합니까? (0) | 2022.07.03 |
동적 소품 포함 VueJ 및 ChartJ (0) | 2022.07.03 |
여러 개체 값을 가진 Element-UI el-select에 태그가 표시되지 않음 (0) | 2022.07.03 |