문자열이 유효한 정수인지 확인하고 싶습니다. 난 그냥 std::stoull
또는 std::stoll
같은 64 비트 정수 및 함수를 사용할 수 있지만 값이 주어진 범위 사이에 있는지 확인할 수 없습니다.올바른 방법으로 문자열을 정수로 변환
예를 들어, 0과 UINT64_MAX 사이의 정수를 원합니다. 문자열이 "-1"
인 경우이를 long long
으로 변환 할 수 있으며 부정적인 것으로 나타납니다. 그러나 문자열이 최대 길이가 인 (일반적으로 INT64_MAX
) 인 경우 문자열이 양의 정수인 동안 오버플로가 다시 음수가됩니다.
친구가 먼저 빼기 기호를 확인하도록 권유했지만이 솔루션이 마음에 들지 않았다면 이중을 사용하는 것에 대해 생각했지만 두 배를 사용하는 비교는 까다로운 일일 수 있음을 알고 있으므로 이 해결책.
template <typename T>
inline bool is_between(const string &str,
T min = numeric_limits<T>::min(),
T max = numeric_limits<T>::max()) noexcept
{
try {
double value = stod(str);
if (value < min || value > max)
return false;
} catch (...) {
return false;
}
return true;
}
이 기능은 안전한가요? 나는 "1"의 문자열 "0.9999999999"의 두 배 값을 반환 할 수 있다는 것을 두려워하기 때문에, 그것은 그 다음 우리는 다음과 같은 기능을 사용할 수있는 1
(100) 사이의 간격에 맞지 않는 것 :
cout << is_between<uint16_t>("0") << endl;
cout << is_between<uint16_t>("65535") << endl;
cout << is_between<uint16_t>("65535", 0, 2000) << endl;
cout << is_between<uint16_t>("-1") << endl;
cout << is_between<uint16_t>("800000") << endl;
'min'과'max'를 문자열로 변환하고 문자열 비교를 해보지 않겠습니까? – NathanOliver
[std :: stoull] (http://en.cppreference.com/w/cpp/string/basic_string/stoul)에서 예외가 발생하지 않습니까? – IInspectable
@IInspectable 만약 입력이 부정적이라면,'std :: stoull'은 올바르게 기억됩니다. – NathanOliver