C 기능 ATOI가 실패했는지 또는 0의 0이 있는지 어떻게 알 수 있습니까?
문제
기능을 사용할 때 atoi
(또는 strtol
또는 그 문제에 대한 유사한 기능), 정수 변환이 실패했는지 또는 변환 된 C- 스트링이 0
?
내가하는 일에 대해 0
수용 가능한 값이고 변환되는 C- 스트링에는 모든 수가 포함될 수 있습니다. 0
에스. 또한 선행 공백이있을 수도 있습니다.
해결책
C ++ 11 이상 :
String-to-Integer 변환의 이동 기능은 이제입니다 stoi
, 그것은 a string
그리고 반환합니다 int
, 또는 오류에 대한 예외를 던졌습니다.
동점이 필요하지 않습니다 istringstream
더 이상 허용 된 답변에 언급 된 해킹.
(또한 있습니다 stol
/stoll
/stof
/stod
/stold
~을 위한 long
/long long
/float
/double
/long double
각각 변환.)
다른 팁
적절한 기능 (C 스타일 함수 사용을 주장하는 한)은 다음과 같습니다. strtol
변환 코드는 다음과 같이 보일 수 있습니다
const char *number = "10"; /* for example */
char *end;
long value = strtol(number, &end, 10);
if (end == number || *end != '\0' || errno == ERANGE)
/* ERROR, abort */;
/* Success */
/* Add whatever range checks you want to have on the value of `value` */
몇 가지 발언 :
strtol
실제 숫자 앞에서 공백을 허용 (의미 : 조용히 건너 뜁니다). 그러한 선행 공백을 오류로 취급 해야하는 경우 직접 확인해야합니다.
수표 *end != '\0'
숫자 후에는 아무것도 없도록합니다. 실제 숫자 (Whitespace?) 이후에 다른 문자를 허용하려면이 점검을 그에 따라 수정해야합니다.
추신 나는 그것을 추가했다 end == number
나중에 빈 입력 시퀀스를 잡으려면 확인하십시오. "모든 공백"과 "전혀 숫자가 없음"입력은 *end != '\0'
혼자 확인하십시오. 그래도 빈 입력을 미리 잡는 것이 합리적 일 수 있습니다. 이 경우 end == number
점검/불필요하게 될 수 있습니다.
이것은 태그가 지정되어 있기 때문입니다 C ++:
template< typename T >
inline T convert(const std::string& str)
{
std::istringstream iss(str);
T obj;
iss >> std::ws >> obj >> std::ws;
if(!iss.eof())
throw "dammit!";
return obj;
}
strtol ()의 맨 페이지에서 :
endptr이 null이 아닌 경우 strtol ()는 *endptr에 첫 번째 유효하지 않은 문자의 주소를 저장합니다. 그러나 숫자가 전혀 없다면 strtol ()은 *endptr에 nptr의 원래 값을 저장합니다. (따라서 *nptr이 아닌 경우
'\0'
그러나 ** endptr입니다'\0'
돌아 왔을 때 전체 문자열이 유효했습니다.)
대안 strtol
~이다 sscanf
, 조금 무겁지만 :
const char *numStr = "12345"; // input string
int value;
if(sscanf(numStr, "%d", &value) == 1)
; // parsing succeeded, use value
else
; // error
그러나 이것은 문자열에서 선행 공백을 허용하고 (바람직하지 않을 수도 있고 아닐 수도 있음), 숫자를 추적 할 수 있으므로 "123ABC"가 허용되고 123을 반환합니다. strtol()
, 처럼 Andreyt가 시연합니다.
내가 한 이후로 오랜 시간이 지났고 C/C ++이지만 (지나치게) 간단한 솔루션은 "0"을 문자열 만 확인하는 것입니다.
int value = atoi(string_number.c_str());
if ( !value && string_number != "0" ) {
// error
} else {
// great success!
}