在C++03中将字符串转换为整数

3

可能是重复问题:
如何在C++中将字符串解析为整数?

C++03中有许多将字符串转换为整数的方法。到目前为止,我发现最好的方法是:

string text;
cin>>text;
int converted;

if ( !(istringstream(text) >> converted) ){
    cout<<"conversion failed\n";
}
cout<<"the converted string is "<<converted;

这种解决方案的问题在于它毫不犹豫地接受“12monkeys”并将其转换为12。有没有一些简单的方法来检查这个,并在这种情况下输出“转换失败”?
需要注意的是,我已经尝试过atoi()、atol()和strtol(),但如果失败它会返回0是无用的。我该如何知道字符串不是“0”?除了strtol()之外也没有范围检查。还没提到“12monkeys”的问题同样存在。

1
你不能使用boost,所以你就不能使用C++11吗?这没有太多意义。Boost可以与C++03一起使用,或者你是想说“和”吗? - chris
3
你是否阅读过类似问题的答案(https://dev59.com/yXVC5IYBdhLWcg3wvT_g)?它详细解决了你的问题。 - vvnraman
如果您无法使用boost::lexical_cast,那么就像我在这里所做的那样自己编写代码。 - Robᵩ
1
要解决“12monkeys”输入的问题,请参见此处 - jrok
1
"strtol() 但它返回0表示失败是无用的。我该怎么知道...请参阅手册strtol。或者阅读wnraman链接的答案。" - Sebastian
显示剩余4条评论
2个回答

2
const char *string = "12monkeys";
char *end;
long value = std::strtol(string, &end, 10);
if (end == string)
    std::cout << "No number found\n";
else if (*end != '\0')
    std::cout << "Extra characters on end.\n";

谢谢,我终于明白如何使用它了。只需将“const char *end”更改为“char *end”,以便编译。 - Slazer
@user1459339 - char *end 是正确的。叹气。已修复。这是我们忽略的一个问题;调用 strtol 会将 const char* 转换为可修改的 char* - Pete Becker

1

您可以明确地检查 eof:

string text;
cin>>text;
int converted;

istringstream iss(text);
if ( !(iss >> converted) ){
    cout<<"conversion failed\n";
}
if( iss.get() != std::stringstream::traits_type::eof() ) {
    cout<<"cocnversion failed\n";
}
cout<<"the converted string is "<<converted;

这似乎是最简单的方法。它甚至不检查范围(strtol也会检查)。 - Slazer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接