std :: atoi()和std :: stoi有什么区别?

时间:2013-12-14 13:34:12

标签: c++11 atoi

atoistoi之间的区别是什么?

我知道,

std::string my_string = "123456789";

为了将该字符串转换为整数,您必须执行以下操作:

const char* my_c_string = my_string.c_str(); 
int my_integer = atoi(my_c_string);

C ++ 11提供了简洁的替代品:

std::string my_string = "123456789"; 
int my_integer = std::stoi(my_string);

1)。这两者之间还有其他差异吗?

2)。效率和性能明智哪一个更好?

3)。哪个更安全?

1 个答案:

答案 0 :(得分:48)

  

1)。这两者之间还有其他差异吗?

我发现std::atoi()是一个可怕的函数:错误时返回零。如果将零视为有效输入,则无法判断转换期间是否存在错误或输入为零。那太糟糕了。请参阅示例How do I tell if the c function atoi failed or if it was a string of zeros?

另一方面,相应的C ++函数会在出错时抛出异常。您可以正确区分错误和零作为输入。

  

2)。效率和性能明智哪一个更好?

如果您不关心正确性,或者您确定不会将零作为输入,或者您认为该错误,那么,也许C函数可能更快(可能是由于缺乏异常处理)。这取决于您的编译器,标准库实现,硬件,输入等。最好的方法是测量它。但是,我怀疑差异,如果有的话,可以忽略不计。

如果您需要快速(但丑陋的C风格)实施,the most upvoted answer问题的How to parse a string to an int in C++?似乎是合理的。但是,除非绝对必要,否则我不会采用该实现(主要是因为不得不混淆char*\0终止)。

  

3)。哪个更安全?

见第一点。

除此之外,如果您需要使用char*并注意\0终止,您更容易犯错误; std::string使用起来更容易,更安全,因为它会处理所有这些事情。