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)。哪个更安全?
答案 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
使用起来更容易,更安全,因为它会处理所有这些事情。