_itoa 和 itoa 有啥区别?
Posted
技术标签:
【中文标题】_itoa 和 itoa 有啥区别?【英文标题】:What is the difference between _itoa and itoa?_itoa 和 itoa 有什么区别? 【发布时间】:2009-10-19 02:47:52 【问题描述】:Visual Studio 对我大喊大叫,说要使用 itoa()
来代替 _itoa()
?
在我看来它们是相同的功能。什么给了?
【问题讨论】:
【参考方案1】:C 运行时库实现不应该引入不在标准中的名称,除非它们遵循特定的命名约定(例如以下划线开头)。微软编译器的早期版本并没有特别严格地遵循这条规则,但随着时间的推移,微软一直在朝着使其实现更符合标准的方向发展。因此,他们过去提供的函数会侵入用户的命名空间,他们一直在使用为编译器实现保留的名称来实现这些名称,并且一直在弃用旧名称。
如果定义了_CRT_NONSTDC_NO_WARNINGS
,MS 编译器不会抱怨itoa()
函数被弃用。但它仍然会抱怨它不安全(您必须定义 _CRT_SECURE_NO_WARNINGS
以消除该警告)。或者使用提供目标缓冲区大小的函数的更安全版本的函数 (_itoa_s()
)
_itoa()
和 itoa()
都解析为库中完全相同的函数到相同的地址 - 除了名称之外没有区别。
【讨论】:
【参考方案2】:MSDN documentation for itoa()
说:
从 Visual C++ 2005 开始不推荐使用此 POSIX 函数。请改用符合 ISO C++ 标准的
_itoa
或安全增强型_itoa_s
。
【讨论】:
难道只是名字不一样?? 这个答案没有说明 _itoa 和 itoa 是否是同一个函数...【参考方案3】:itoa 不是标准的 C。
“此函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但受某些编译器支持。” - cplusplus.com
所以 MSVS 告诉您使用 _itoa 来告诉您它不是标准 C++ 并且您应该将其标记为标准。我相信它的存在是为了向后兼容,并且这种符号是为了便于阅读和区分。
【讨论】:
【参考方案4】:itoa
不是标准的,所以你应该使用 stringstream 来代替。
你需要#include <sstream>
它的使用示例是:
int i = 5;
std::stringstream ss;
ss << i;
std:: cout << ss.str();
【讨论】:
我不明白为什么我们必须使用具有 _itoa() 或 _itoa_s() 的流。我认为创建流以仅将数字转换为字符串的两种选择是更好的选择。 itoa 不是标准的,您仍然可以使用它。只要确保您使用的编译器支持它。字符串流是正确的做法。 不,这是 C++ 的做法,而且是 C++ 并不意味着它是正确的。【参考方案5】:回复布鲁斯的回答:
itoa
不是标准的,所以你应该使用 stringstream 来代替。你需要
#include <sstream>
它的使用示例是:
int i = 5;
std::stringstream ss;
ss << i;
std:: cout << ss.str();
您也可以编写自己的 itoa()
函数来代替
例如:
const char* itoa (int num)
if (num == 0)
return "0";
bool neg = false;
if (num < 0)
neg = true;
num = -num;
int digits = 0;
int tmp = num;
while (tmp > 0)
digits++;
tmp /= 10;
int digs[digits];
for (tmp = digits; num > 0; tmp--)
digs[tmp] = num % 10;
num /= 10;
string s = neg == true ? "-" : "";
for (tmp = 1; tmp <= digits; tmp++)
s += (char)(digs[tmp] + 48);
return s.c_str();
【讨论】:
此函数效率低下、不可移植且浪费:调用者无法正确丢弃分配给string
的内存,因为返回的指针也可能指向字符串文字。 C++ 不是 Java。以上是关于_itoa 和 itoa 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
_itoa atoiatofitoaitow _itoa_s 类型转换使用说明