是否有一个可以在c ++中替换atoi的函数。 我做了一些研究,没有找到任何替代它,唯一的解决方案是使用cstdlib或自己实现
答案 0 :(得分:17)
如果您不想使用Boost,C ++ 11为字符串添加了std::stoi
。所有类型都有类似的方法。
std::string s = "123"
int num = std::stoi(s);
与atoi
不同,如果无法进行转换,则会引发invalid_argument
异常。此外,如果值超出int的范围,则抛出out_of_range
异常。
答案 1 :(得分:9)
boost::lexical_cast
是你的朋友
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
std::string s = "123";
try
{
int i = boost::lexical_cast<int>(s); //i == 123
}
catch(const boost::bad_lexical_cast&)
{
//incorrect format
}
}
答案 2 :(得分:4)
你可以使用Boost函数boost :: lexical_cast&lt;&gt;如下:
char* numericString = "911";
int num = boost::lexical_cast<int>( numericString );
可以找到更多信息here(最新的Boost版本1.47)。请记住妥善处理异常。
答案 3 :(得分:3)
没有提升:
stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
大约和boost版本一样恼人但没有添加依赖项。可能会浪费更多的公羊。
答案 4 :(得分:2)
你没有说为什么atoi
不合适,所以我猜它与性能有关。无论如何,澄清会有所帮助。
使用Boost Spirit.Qi比atoi
快一个数量级,至少在tests done by Alex Ott。
我没有参考,但上次测试时,Boost lexical_cast
比atoi
慢了一个数量级。我认为原因是它构造了一个非常昂贵的字符串流。
答案 5 :(得分:0)
您可以使用stoi();
#include <string>
// Need to include the <string> library to use stoi
int mani(){
std::string s = "10";
int n = stoi(s);
}
要实际编译这个,你必须启用c ++ 11,在google上查找如何操作(在代码:: blocks它是:Settings - &gt; Compiler - &gt;“让g ++跟随C ++ 11 ISO C ++语言标准“) 如果从终端编译,则必须添加-std = c ++ 11
g++ -std=c++11 -o program program.cpp