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

Bhu*_*ant 42 atoi c++11

atoi和之间有什么区别stoi

我知道,

std::string my_string = "123456789";
Run Code Online (Sandbox Code Playgroud)

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

const char* my_c_string = my_string.c_str(); 
int my_integer = atoi(my_c_string);
Run Code Online (Sandbox Code Playgroud)

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

std::string my_string = "123456789"; 
int my_integer = std::stoi(my_string);
Run Code Online (Sandbox Code Playgroud)

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

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

3).哪个更安全?

Ali*_*Ali 53

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

我发现std::atoi()一个可怕的功能:它在出错时返回零.如果将零视为有效输入,则无法判断转换期间是否存在错误或输入为零.那太糟糕了.请参阅示例如何判断c函数atoi是否失败或者是否为零字符串?

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

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

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

如果你需要一个快速(但丑陋的C风格)实现,那么对于如何在C++中将字符串解析为int的最受欢迎的答案问题似乎合理.但是,除非绝对必要,否则我不会采用该实现(主要是因为必须混乱char*\0终止).

3).哪个更安全?

见第一点.

除此之外,如果你需要工作char*并注意\0终止,你更容易犯错误; std::string因为它将照顾所有这些东西,因此更容易和更安全.

  • 这是非常可靠的建议.关于你的第一点(返回值与错误代码),我检查了atoi的手册页,它说:"它相当于:(int)strtol(str,(char**)NULL,10);`,并且从strtol的手册页,第二个参数:`(因此,如果*first_param不是'\ 0'但返回时**second_param是'\ 0',整个字符串都是有效的.)`.因此,似乎使用第二个参数的strtol会比atoi更好,以避免在第1点中描述的问题.strtol可以包含在stdlib.h中. (3认同)