C 기능 ATOI가 실패했는지 또는 0의 0이 있는지 어떻게 알 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1640720

  •  08-07-2019
  •  | 
  •  

문제

기능을 사용할 때 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 점검/불필요하게 될 수 있습니다.

이것은 태그가 지정되어 있기 때문입니다 :

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!
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top