_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 &lt;sstream&gt;

它的使用示例是:

int i = 5; std::stringstream ss;

ss &lt;&lt; i;

std:: cout &lt;&lt; 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 类型转换使用说明

C++ 中的sprintf和snprintf 函数的区别

_itoa_s 函数在 Android Studio 本机 C++ 上显示错误

C语言中字符串如何转换为二进制、八进制、十进制、十六进制

在C语言中有啥方法可以测试输入的数字的长度?

itoa()函数和atoi()函数详解