4

我可以想到两种将字符串转换为int:strtolstd::stringstream. 前者不报告错误(如果字符串不是数字的表示),后者抛出异常但它太宽松了。一个例子:

std::wstring wstr("-123a45");
int result = 0;
try { ss >> result; }
catch (std::exception&) 
{
   // error handling
}

我想在这里检测一个错误,因为整个字符串不能转换为 int,但是没有抛出异常并且结果设置为 -123。如何使用标准 C++ 工具解决我的任务?

4

3 回答 3

6

您错误地认为strtol()不提供错误检查,但事实并非如此。第二个参数strtol()可用于检测是否消耗了整个字符串。

char *endptr;
int result = strtol("-123a45", &endptr, 10);
if (*endptr != '\0') {
    /*...input is not a decimal number */
}
于 2013-09-27T09:03:51.400 回答
4

std::stoi,或std::strtol

第一个抛出异常(在 C++11 及更高版本中),另一个你必须手动检查(因为它最初是标准 C 函数)。

您确实可以使用它std::strtol来检查字符串是否为有效数字:

char some_string[] = "...";

char *endptr;
long value = std::strtol(some_string, &endptr, 10);

if (endptr == some_string)
{
    // Not a valid number at all
}
else if (*endptr != '\0')
{
    // String begins with a valid number, but also contains something else after the number
}
else
{
    // String is a number
}
于 2013-09-27T08:58:50.837 回答
0

An alternative approach, you could convert to an int, and then convert that back into a wstring, and check the strings for equality.

Not a good idea for doubles, and you would probably need to trim the input string of whitespace even for ints.

于 2013-09-27T09:06:04.937 回答