使用wcstombs_s将std :: wsting转换为char*

Jus*_* R. 7 c++ string wstring c++11

我输入的字符串只包含数字(只是简单的拉丁文字符串,0-9,所以例如"0123"),存储为std :: wstring,我需要每个字符串作为char*.这对我来说最好的方法是什么?这是我最初的做法:

void type::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString)
{
    outputString = new char[outputSize];
    size_t charsConverted = 0;
    const wchar_t * inputW = input.c_str();
    wcstombs_s(&charsConverted, outputString, sizeof(outputString), inputW, input.length());
}
Run Code Online (Sandbox Code Playgroud)

编辑:下面的代码工作.谢谢大家!

void type::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString)
{
    size_t outputSize = input.length() + 1; // +1 for null terminator
    outputString = new char[outputSize];
    size_t charsConverted = 0;
    const wchar_t * inputW = input.c_str();
    wcstombs_s(&charsConverted, outputString, outputSize, inputW, input.length());
}
Run Code Online (Sandbox Code Playgroud)

Nem*_*ric 10

您没有为缓冲区分配足够的内存:

char * outputString = new char[input.length()];
Run Code Online (Sandbox Code Playgroud)

应该

char * outputString = new char[input.length() + 1];
Run Code Online (Sandbox Code Playgroud)

因为终止NUL字符.

哦,还有,根据pm100的评论:sizeof(outputString)给你指针的大小.您应该使用input.length() + 1,因为这是缓冲区的大小.


Pra*_*ian 5

您的代码中存在一些错误.首先,您没有在目标缓冲区中为NULL字符分配足够的空间.您必须至少input.length() + 1为函数分配字符才能成功.

其次,您没有将输出缓冲区的正确大小传递给函数.sizeof(outputString)返回outputString自身的大小a char *,而不是该指针指向的字节数.

所以你的函数应该是这样的:

void CoverageTileManager::convertWStringToCharPtr(_In_ std::wstring input, _Out_ char * outputString)
{
    size_t outputSize = input.length() + 1;
    outputString = new char[outputSize];
    size_t charsConverted = 0;
    wcstombs_s(&charsConverted, outputString, outputSize, input.c_str(), input.length());
    // TODO verify charsConverted = outputSize
}
Run Code Online (Sandbox Code Playgroud)