_itoa_s 不接受动态数组

_itoa_s doesn't accept dynamic array

我是 C++ 和动态内存分配的新手。

我有这段代码可以将数字从十进制转换为十六进制,它使用动态数组:

int hexLen = value.length();
char* arrayPtr = new char[hexLen];

_itoa_s(stoi(dec), arrayPtr, 16);

string hexVal = static_cast<string>(arrayPtr);

delete[] charArrayptr;

当我使用固定大小的数组时,_itoa_s() 使用它。但是,当使用动态数组时,编译器说不存在具有给定参数的方法。

这是我做错了什么,还是 _itoa_s() 根本无法使用动态数组?

带有非动态数组的版本(有效):

const int LENGTH = 20;
char hexCharArray[LENGTH];

_itoa_s(stoi(dec), hexCharArray, 16);

这就是我将十六进制转换为字符串的方式(C++20 和 C++20 之前)

#include <format> // C++20
#include <string>
#include <sstream>
#include <iostream>

int main()
{
    int value = 123;

    // pre c++20 formatting
    std::ostringstream os;
    os << "0x" << std::hex << value << "n";
    std::cout << os.str();

    // c++20 formatting
    auto string = std::format("0x{:x}", value);
    std::cout << string;

    return 0;
}

如果您仔细阅读 documentation,您会发现您正在尝试调用 _itoa_s() 的模板重载,它接收对固定大小数组的引用:

template <size_t size>
errno_t _itoa_s( int value, char (&buffer)[size], int radix ); 

您需要改为调用接受指针和大小的非模板重载:

errno_t _itoa_s( int value, char * buffer, size_t size, int radix );

试试这个:

int decValue = stoi(dec);

int hexLen = value.length();
int arraySize = hexLen + 1; // +1 for null terminator!

char* arrayPtr = new char[arraySize];

errno_t errCode = _itoa_s(decValue, arrayPtr, arraySize, 16);
if (errCode != 0)
{
    // error handling...
}
else
{
    string hexVal = arrayPtr;
    // use hexVal as needed...
}
delete[] charArrayptr;

由于您试图将十六进制变成 string,因此您可以完全取消 char*

int decValue = stoi(dec);

string hexVal;
hexVal.resize(value.length());

errno_t errCode = _itoa_s(decValue, &hexVal[0], hexVal.size()+1, 16);
if (errCode != 0)
{
    // error handling...
}
else
{
    hexVal.resize(strlen(hexVal.c_str())); // truncate any unused portion
    // use hexVal as needed...
}