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

时间:2013-09-05 20:59:31

标签: c++ string c++11 wstring

我输入的字符串只包含数字(只是普通的拉丁文,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());
}

编辑:以下代码有效。谢谢大家!

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());
}

3 个答案:

答案 0 :(得分:10)

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

char * outputString = new char[input.length()];

应该是

char * outputString = new char[input.length() + 1];

因为终止NUL字符。

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

答案 1 :(得分:5)

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

其次,您没有将输出缓冲区的正确大小传递给函数。 sizeof(outputString)返回outputString本身的大小,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
}

答案 2 :(得分:2)

在C ++中,我永远不会使用纯指针:如果堆中需要一个char数组,请使用vector!你想复制源字符串吗?如果没有,const引用应该用于inputwcstombs_s仅在Windows中使用,为什么不使用WideCharToMultiByte?转换成功了吗?返回值。

bool CoverageTileManager::convertWStringToCharPtr(const std::wstring& input, std::vector<char>& outputString )
{
    if ( input.empty() ) {
       return false;
    }
    int size = WideCharToMultiByte(CP_ACP,0,input.c_str(),input.size(),NULL,0,NULL,NULL);
    if ( size <= 0 ) {
      return false;
    }
    outputString.resize(size+1);
    if ( WideCharToMultiByte(CP_ACP,0,input.c_str(),input.size(),&outputString[0],size,NULL,NULL) <= 0 ) {
       outputString.clear();
       return false;
    }
    outputString[size] = '\0';
    return true;
}

将vector用于外部C ++ lib:

extern void call( const char*, size_t);
std::vector<char> buffer;
std::wstring input;
...
if ( convertWStringToCharPtr(input,buffer) ) {
    call(&buffer[0],buffer.size());
}