10

itoa()Visual Studio は、代わりに使用すると言って使用について私に怒鳴ってい_itoa()ますか?

それらは同じ機能であるように私には見えます。何を与える?

4

5 に答える 5

23

AC ランタイム ライブラリの実装では、特定の命名規則 (アンダースコアで始まるなど) に従わない限り、標準にない名前を導入することは想定されていません。Microsoft のコンパイラの以前のバージョンは、この規則に特に厳密に従っていませんでしたが、時間の経過とともに、Microsoft は実装をより標準に準拠させる方向に進んでいます。そのため、彼らが提供していた関数は、ユーザーの名前空間に侵入し、コンパイラの実装用に予約されている名前を使用して実装しており、古い名前を非推奨にしています。

が定義されている場合、MS コンパイラは関数が非推奨であること_CRT_NONSTDC_NO_WARNINGSについて文句を言いません。itoa()しかし、それはまだ安全ではないことを訴えます (_CRT_SECURE_NO_WARNINGSその警告を静かにするように定義する必要があります)。_itoa_s()または、関数にデスティネーション バッファ サイズを提供する、より安全なバージョンの関数 ( ) を使用します。

と の両方が、ライブラリ内の同じアドレスまでのまったく同じ関数_itoa()itoa()解決されます。名前以外に違いはありません。

于 2009-10-19T05:57:48.540 に答える
8

MSDNドキュメントにitoa()は次のように書かれています:

この POSIX 関数は、Visual C++ 2005 以降では非推奨です。代わりに、ISO C++ 準拠_itoaまたはセキュリティ強化を使用してください。_itoa_s

于 2009-10-19T02:52:18.803 に答える
1

Bruce による回答への返信:

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();
}
于 2009-10-27T10:00:32.243 に答える