【问题标题】:Using wstring for swprintf_s instead of wchar_t * [duplicate]将 wstring 用于 swprintf_s 而不是 wchar_t * [重复]
【发布时间】:2016-01-06 18:42:16
【问题描述】:

如何使用std::wstring 变量作为swprintf_s 的参数而不是wchar_t *

我的代码如下但有错误:

#include <string>
#include <iostream>
using namespace std;

int main(){
    std::wstring     msg(20, 0);
    swprintf_s( msg.c_str(), 20, L"This is a test for using std::wstring");//this line has error

 wcout<< msg<< endl;
return 0;
}

【问题讨论】:

  • 错误(活动)重载函数“swprintf_s”的实例与参数列表不匹配
  • 您不能直接执行此操作,因为底层缓冲区并不打算写入。字符串对象中的其他字段不会正确更新(如长度),即使您使用创造性投射强制它会导致稍后出现奇怪的错误。
  • en.cppreference.com/w/cpp/string/basic_string std::wstring::c_str 的签名是“const wchar_t * c_str() const;”这意味着它返回一个“const wchar_t *”,而 swprintf_s 想要一个“wchar_t *”。所以你应该寻找一种不同的方法来做到这一点。
  • 这听起来像是一个 XY 问题。你到底想达到什么目的?

标签: c++ wstring


【解决方案1】:

swprintfswprintf_s 写入其第一个参数指向的内存。因此,该参数不能是 const char 或 wchar 指针。但是 std::wstring::c_str() 的返回值是 const char* 。因此,您不能只使用const。正如 Jason 所说,如果您违反规则,wstring::size() 可能不会返回正确的值。

你能做的是

wchar_t buffer[20];

swprintf_s(buffer, 20, L"This is a test for using std::wstring");

如果你想要一个 std::wstring,你可以使用构造函数,比如 wstring msg(buffer)

【讨论】:

  • "所以你不能只使用 'const'。" -- 你可以,从 C++11 开始。 msg.c_str() 保证与&amp;msg[0] 相同(前提是字符串非空)。
  • @hvd 你在技术上是正确的,但是 string.length() 不会被更新。
  • @CS Pei 您的解决方案存在语法错误。 wchar_t * buffer[20]; 应该改为 wchar_t buffer[20]; 因为我们不需要指向数组的指针
  • 谢谢。你说的对。固定
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 2017-12-12
  • 2013-07-28
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 2011-07-29
  • 2012-02-13
相关资源
最近更新 更多