10

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

3 回答 3

13

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

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

应该

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

因为终止 NUL 字符。

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

于 2013-09-05T21:02:20.147 回答
6

您的代码中有几个错误。首先,您没有在目标缓冲区中为 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
}
于 2013-09-05T21:11:35.133 回答
3

在 C++ 中,我永远不会使用纯指针:vector如果堆中需要 char 数组,请使用!你想复制源字符串吗?如果不是,则应使用 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;
}

使用向量到外部 C++ 库:

extern void call( const char*, size_t);
std::vector<char> buffer;
std::wstring input;
...
if ( convertWStringToCharPtr(input,buffer) ) {
    call(&buffer[0],buffer.size());
}
于 2013-09-05T21:25:21.903 回答