我做了一些研究,有些人说使用atio而其他人说它很糟糕,我无论如何也无法让它工作。
所以我只想问一下,将字符串转换为int的正确方法是什么。
string s = "10";
int i = s....?
谢谢!
答案 0 :(得分:84)
在C ++ 11中,使用std::stoi
:
std::string s = "10";
int i = std::stoi(s);
请注意,如果转换无法执行,std::stoi
将抛出std::invalid_argument
类型的异常;如果转换导致溢出,则std::out_of_range
会抛出int
(即字符串值对于{ {1}}类型)。您可以使用std::stol
或std:stoll
,但如果int
对于输入字符串来说似乎太小。
在C ++ 03/98中,可以使用以下任何一种方法:
std::string s = "10";
int i;
//approach one
std::istringstream(s) >> i; //i is 10 after this
//approach two
sscanf(s.c_str(), "%d", &i); //i is 10 after this
请注意,输入s = "10jh"
上述两种方法都会失败。他们将返回10而不是通知错误。因此,安全可靠的方法是编写自己的函数来解析输入字符串,并验证每个字符以检查它是否为数字,然后相应地工作。这是一个强大的实现(虽然未经测试):
int to_int(char const *s)
{
if ( s == NULL || *s == '\0' )
throw std::invalid_argument("null or empty string argument");
bool negate = (s[0] == '-');
if ( *s == '+' || *s == '-' )
++s;
if ( *s == '\0')
throw std::invalid_argument("sign character only.");
int result = 0;
while(*s)
{
if ( *s >= '0' && *s <= '9' )
{
result = result * 10 - (*s - '0'); //assume negative number
}
else
throw std::invalid_argument("invalid input string");
++s;
}
return negate ? result : -result; //-result is positive!
}
此解决方案是my another solution的略微修改版本。
答案 1 :(得分:13)
您可以使用boost::lexical_cast:
#include <iostream>
#include <boost/lexical_cast.hpp>
int main( int argc, char* argv[] ){
std::string s1 = "10";
std::string s2 = "abc";
int i;
try {
i = boost::lexical_cast<int>( s1 );
}
catch( boost::bad_lexical_cast & e ){
std::cout << "Exception caught : " << e.what() << std::endl;
}
try {
i = boost::lexical_cast<int>( s2 );
}
catch( boost::bad_lexical_cast & e ){
std::cout << "Exception caught : " << e.what() << std::endl;
}
return 0;
}
答案 2 :(得分:9)
没有“正确的方法”。如果你想要一个通用的(但不是最理想的)解决方案,你可以使用boost :: lexical cast。
C ++的常见解决方案是使用std :: ostream和&lt;&lt;运营商。您可以使用stringstream和stringstream :: str()方法转换为字符串。
如果你真的需要快速机制(请记住20/80规则),你可以寻找像http://www.partow.net/programming/strtk/index.html这样的“专用”解决方案
最诚挚的问候,
马尔钦
答案 3 :(得分:7)
您可以使用istringstream。
string s = "10";
// create an input stream with your string.
istringstream is(str);
int i;
// use is like an input stream
is >> i;
答案 4 :(得分:4)
一些方便的快速功能(如果你没有使用Boost):
template<typename T>
std::string ToString(const T& v)
{
std::ostringstream ss;
ss << v;
return ss.str();
}
template<typename T>
T FromString(const std::string& str)
{
std::istringstream ss(str);
T ret;
ss >> ret;
return ret;
}
示例:
int i = FromString<int>(s);
std::string str = ToString(i);
适用于任何可流式类型(浮动等)。您需要#include <sstream>
,也可能#include <string>
。