_itoa和itoa有什么区别?

时间:2009-10-19 02:47:52

标签: c++ c visual-studio itoa

Visual Studio对我使用itoa()说使用_itoa()代替我大吼大叫?

在我看来,它们是相同的功能。是什么给了什么?

5 个答案:

答案 0 :(得分:21)

C运行时库实现不应该引入不在标准中的名称,除非它们遵循某种命名约定(例如以下划线开头)。微软编译器的早期版本没有特别严格地遵循这一规则,但随着时间的推移,微软一直在努力使其实现更符合标准。因此,他们用来提供的函数会侵入用户命名空间,他们一直使用为编译器实现保留的名称来实现,并且一直在弃用旧名称。

如果定义了_CRT_NONSTDC_NO_WARNINGS,MS编译器将不会抱怨不推荐使用itoa()函数。但它仍然会抱怨它不安全(你必须定义_CRT_SECURE_NO_WARNINGS来安静地发出警告)。或者使用提供具有目标缓冲区大小的函数的函数(_itoa_s())的更安全版本

_itoa()itoa()都解析为库中完全相同的函数,直到相同的地址 - 除了名称之外没有区别。

答案 1 :(得分:8)

MSDN documentation for itoa()说:

  

从Visual C ++ 2005开始,不推荐使用此POSIX函数。请改用符合ISO C ++ _itoa或安全性增强_itoa_s

答案 2 :(得分:5)

itoa不是标准C.

“此函数未在ANSI-C中定义,并且不是C ++的一部分,但有些编译器支持。” - cplusplus.com

所以MSVS告诉你使用_itoa告诉你它不是标准的C ++,你应该这样标记它。我认为这是为了向后兼容,并且这种表示法是为了便于阅读和区分。

答案 3 :(得分:4)

itoa不是标准的,所以你应该使用stringstream。

您需要#include <sstream>

它的一个例子是:

int i = 5;
std::stringstream ss;

ss << i;

std:: cout << ss.str();

答案 4 :(得分:1)

回答布鲁斯的回答:

  

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();
}