Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

_itoa_s doesn't accept dynamic array

I am new to C++ and dynamic memory allocation.

I have this code to convert a number from decimal to hexadecimal, that uses a dynamic array:

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

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

string hexVal = static_cast<string>(arrayPtr);

delete[] charArrayptr;

When I used an array with a fixed size, _itoa_s() worked with it. However, when using a dynamic array, the compiler says that a method with the arguments given doesn’t exist.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Is this something that I did wrong, or will _itoa_s() simply not work with a dynamic array?

Version with non-dynamic array (that works):

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

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

>Solution :

If you read the documentation carefully, you would see that you are trying to call the template overload of _itoa_s() that takes in a reference to a fixed-sized array:

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

You would need to instead call the non-template overload that takes in a pointer and a size:

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

Try this:

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;

Since you are trying to get the hex into a string, you can do away with the char* altogether:

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...
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading