【问题标题】:C++ / Concatenate std::string and wchar* to wchar*C++ / 将 std::string 和 wchar* 连接到 wchar*
【发布时间】:2013-03-01 05:10:04
【问题描述】:

我想将std::string 和WCHAR* 连接起来,结果应该在WCHAR* 中。

我尝试了以下代码

size_t needed = ::mbstowcs(NULL,&input[0],input.length());
std::wstring output;
output.resize(needed);
::mbstowcs(&output[0],&input[0],input.length());
const wchar_t wchar1 = output.c_str();
const wchar_t * ptr=wcsncat( wchar1, L" program", 3 );

我收到以下错误

错误 C2220:警告视为错误 - 未生成“对象”文件

错误 C2664: 'wcsncat' : 无法将参数 1 从 'const wchar_t *' 转换为 'wchar_t*'

【问题讨论】:

  • 很好。你有没有尝试过?
  • 不欢迎你。尝试一些东西,向我们展示一些努力或使用示例,然后编辑您的问题。 :3c
  • 是的 ma..ha..aster (吱吱声)... master... ma.. ma..
  • output.c_str() 返回const wchar_t *(注意星号)。您必须相应地声明wchar1 的类型。此外,对于 wcsncat 的结果,您需要一个不带 const 的 wchar_t *。你不能在那里使用output.c_str()。

标签: c++ visual-c++


【解决方案1】:

如果您调用string.c_str() 来获取原始缓冲区,它将返回一个 const 指针以指示您不应尝试更改缓冲区。而且绝对不应该尝试将任何东西连接到它。使用第二个字符串类实例,让运行时为您完成大部分工作。

std::string input; // initialized elsewhere
std::wstring output;

output = std::wstring(input.begin(), input.end());
output = output + std::wstring(L" program"); // or output += L" program";
const wchar_t *ptr = output.c_str();

还要记住这一点。一旦“输出”超出范围并销毁,“ptr”将无效。

【讨论】:

  • +1 for std::wstring(L" program"); // or output += L" program";(我不确定operator+ 是否返回std::wstring,因为它是一个非成员函数,不像operator+=。)
【解决方案2】:

如文档所述

wchar_t * wcsncat (wchar_t * 目标, wchar_t * 源, size_t num ); 将源的第一个 num 宽字符附加到目标,加上终止的空宽字符。 返回目的地。 (来源:http://www.cplusplus.com/reference/cwchar/wcsncat/)

您不能将您的 const wchar1 作为目标传递,因为该函数将修改它然后返回它。所以你更好

  • 分配适当大小的 wchar 数组
  • 将您的字符串复制到其中
  • 以 newley 分配的 wchar 数组作为目标调用 wcsncat。

但是,我想知道您是否不能只使用字符串来进行操作,这更像是 C++ 的方式。 (数组是 C 风格的)

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 2010-12-10
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2014-11-19
    • 2013-02-02
    • 2023-03-27
    相关资源
    最近更新 更多