【问题标题】:adding crlf to WCHAR * in VC++ 2005在 VC++ 2005 中将 crlf 添加到 WCHAR *
【发布时间】:2019-05-22 01:56:08
【问题描述】:

这是 VC++ 2005: 如何将一个 WCHAR * "firstText" 和另一个 WCHAR * "secondText" 附加到另一个 WCHAR * "thirdText" 中,并在它们之间添加一个 CRLF "\r\n"?

WCHAR firstText [100] = L"First line";

WCHAR secondText [100] = L"Second line";

WCHAR thirdText [500] = L"";

非常感谢您的帮助!

【问题讨论】:

  • 首选std::wstring 而不是宽字符数组。可移植 C++ 中没有 WCHAR 类型。那是MS的typedef。
  • 我正在尝试,但是我需要将 std::wstring 转换为 BSTR,因为我的发送电子邮件功能使用 BSTR 作为输入...
  • 我这样做:std::wstring firstText (L"abc"); std::wstring secondText (L"def"); std::wstring thirdText ( L"" ); thirdText += firstText + L"\r\n" + secondText;但是第三个文本是“abc def”....我做错了吗???所以没有换行...
  • @Abe000 您可以使用_bstr_t 或直接使用SysAllocString()std::wstring 转换为BSTR。此外,std::wstring thirdText ( L"" ); thirdText += firstText + ... 应该是 std::wstring thirdText = firstText + ...。但是,无论哪种方式,这段代码 sn-p 都无法产生您声称的结果。之后代码中的其他内容必须将换行符转换为空格。可能在您的电子邮件代码中。
  • 非常感谢您的帮助。我想我需要浏览整个代码......

标签: c++ visual-c++ newline wchar


【解决方案1】:

您可以像使用非 W 字符串一样执行相同的操作,但使用函数的宽字符串版本,例如(未经测试)

int thirdTextMax = (sizeof(thirdText)/sizeof(thirdText[0]));
swprintf(thirdText, thirdTextMax, L"%s\r\n%s", firstText, secondText);

int firstTextLen = wcslen(firstText);
wcsncpy(thirdText, firstText, thirdTextMax);
wcsncpy(thirdText + firstTextLen, L"\r\n", thirdTextMax - firstTextLen);
wcsncpy(thirdText + firstTextLen + 2, secondText, thirdTextMax - firstTextLen - 2);

(也有这些函数的 _s 版本要格外小心溢出缓冲区,但我不记得它们是否在 VC2005 中。)

【讨论】:

  • 或者更好,因为问题被标记为c++,所以使用std::wstring而不是WCHAR[],那么你可以使用它的operator+=,或者std::wostringstream。如果您需要wchar_t*,请使用std::wstring::c_str()
  • 谢谢大家,但是“thirdTextMax”是什么?应该是本例中为 500 的thirdText 的最大长度吗?
  • 是的,我就是这个意思。抱歉,我在第一个示例中从 sizeof 计算它,但不是第二个。
  • @Abe000 请注意 wcsncpy 变体效率很低:首先,您需要遍历第一个文本以找到长度,然后再次遍历以进行复制。 wcsncpy 用空字符填充整个数组的其余部分,但无论如何都会被覆盖(最后一次调用除外)。所以你真的应该更喜欢第一个变体 - 太糟糕了,虽然没有 snwprintf... 所以在 general (在给定的情况下,缓冲区大小适合!),我会选择 @987654331 @ - 如果你坚持使用数组,否则,请参阅 Remy 的评论!
  • 整个 *cpy 函数系列(无论是否宽)都存在很大的设计缺陷:为什么要再次返回 dest?如果返回指向终止 0 的指针会更有用 - 除了众所周知的问题(如果目标太小,要么填充很多,要么根本不终止......)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多