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)。哪个使用更安全?
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
使用起来更容易、更安全,因为它会处理所有这些事情。
atoi()
都是用于转换为整数的函数stoi 将字符串转换为整数
stoi():执行输入验证。如果输入字符串不是整数的有效表示,它会抛出 std::invalid_argument 异常;如果转换后的值超出目标类型的范围,它会抛出 std::out_of_range 异常。