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

问题描述 投票:0回答:2

atoi
stoi
有什么区别?

我知道,

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)。哪个使用更安全?

c++11 atoi
2个回答
78
投票

1)。两者之间还有其他区别吗?

我发现

std::atoi()
是一个可怕的函数:出错时返回零。如果您将零视为有效输入,那么您无法判断转换过程中是否出现错误或输入为零。那太糟糕了。例如,请参阅如何判断 c 函数 atoi 是否失败或者它是否是一串零?

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

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

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

如果您需要快速(但丑陋的 C 风格)实现,“How to parse a string to an int in C++?”问题的“最受欢迎的答案”似乎是合理的。但是,除非绝对必要,否则我不会采用该实现(主要是因为必须搞乱 char*\0

 终止)。
  
3)。哪个使用更安全?

参见第一点。

除此之外,如果您需要使用

char*

并注意

\0

 的终止,您就更有可能犯错误。 
std::string
 使用起来更容易、更安全,因为它会处理所有这些事情。


0
投票

atoi()

 都是用于转换为整数的函数
stoi 将字符串转换为整数

    atoi 将字符数组转换为整数
  1. 错误处理:

stoi():执行输入验证。如果输入字符串不是整数的有效表示,它会抛出 std::invalid_argument 异常;如果转换后的值超出目标类型的范围,它会抛出 std::out_of_range 异常。

    atoi():不执行输入验证。如果输入的字符串无效,将返回0。
© www.soinside.com 2019 - 2024. All rights reserved.