_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...
}
我是 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...
}