为什么下面的C++代码只打印第一个字符?

发布于 2024-10-08 11:48:26 字数 390 浏览 6 评论 0原文

我正在尝试将 char 字符串转换为 wchar 字符串。

更详细地说:我试图首先将 char[] 转换为 wchar[],然后将“1”附加到该字符串并打印它。

char src[256] = "c:\\user";

wchar_t temp_src[256];
mbtowc(temp_src, src, 256);

wchar_t path[256];

StringCbPrintf(path, 256, _T("%s 1"), temp_src);
wcout << path;

但它只打印 c

这是从 char 转换为 wchar 的正确方法吗?从那时起我就知道了另一种方法。但我想知道为什么上面的代码会这样工作?

I am trying to convert a char string to a wchar string.

In more detail: I am trying to convert a char[] to a wchar[] first and then append " 1" to that string and the print it.

char src[256] = "c:\\user";

wchar_t temp_src[256];
mbtowc(temp_src, src, 256);

wchar_t path[256];

StringCbPrintf(path, 256, _T("%s 1"), temp_src);
wcout << path;

But it prints just c

Is this the right way to convert from char to wchar? I have come to know of another way since. But I'd like to know why the above code works the way it does?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

从﹋此江山别 2024-10-15 11:48:26

mbtowc 仅转换单个字符。您是否打算使用mbstowcs

通常您会调用该函数两次;第一个获取所需的缓冲区大小,第二个实际转换它:

#include <cstdlib> // for mbstowcs

const char* mbs = "c:\\user";
size_t requiredSize = ::mbstowcs(NULL, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
if(::mbstowcs(wcs, mbs, requiredSize + 1) != (size_t)(-1))
{
    // Do what's needed with the wcs string
}
delete[] wcs;

如果您更愿意使用 mbstowcs_s(因为弃用警告),然后执行以下操作:

#include <cstdlib> // also for mbstowcs_s

const char* mbs = "c:\\user";
size_t requiredSize = 0;
::mbstowcs_s(&requiredSize, NULL, 0, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
::mbstowcs_s(&requiredSize, wcs, requiredSize + 1, mbs, requiredSize);
if(requiredSize != 0)
{
    // Do what's needed with the wcs string
}
delete[] wcs;

确保通过 setlocale() 或使用 mbstowcs() 版本(例如 mbstowcs_l()或采用区域设置参数的 mbstowcs_s_l())。

mbtowc converts only a single character. Did you mean to use mbstowcs?

Typically you call this function twice; the first to obtain the required buffer size, and the second to actually convert it:

#include <cstdlib> // for mbstowcs

const char* mbs = "c:\\user";
size_t requiredSize = ::mbstowcs(NULL, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
if(::mbstowcs(wcs, mbs, requiredSize + 1) != (size_t)(-1))
{
    // Do what's needed with the wcs string
}
delete[] wcs;

If you rather use mbstowcs_s (because of deprecation warnings), then do this:

#include <cstdlib> // also for mbstowcs_s

const char* mbs = "c:\\user";
size_t requiredSize = 0;
::mbstowcs_s(&requiredSize, NULL, 0, mbs, 0);
wchar_t* wcs = new wchar_t[requiredSize + 1];
::mbstowcs_s(&requiredSize, wcs, requiredSize + 1, mbs, requiredSize);
if(requiredSize != 0)
{
    // Do what's needed with the wcs string
}
delete[] wcs;

Make sure you take care of locale issues via setlocale() or using the versions of mbstowcs() (such as mbstowcs_l() or mbstowcs_s_l()) that takes a locale argument.

╰◇生如夏花灿烂 2024-10-15 11:48:26

为什么你使用C代码,为什么不以更可移植的方式编写它,例如我在这里要做的是使用STL!

std::string  src = std::string("C:\\user") +
                   std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());

wcout << dne;

就这么简单,很容易:D

why are you using C code, and why not write it in a more portable way, for example what I would do here is use the STL!

std::string  src = std::string("C:\\user") +
                   std::string(" 1");
std::wstring dne = std::wstring(src.begin(), src.end());

wcout << dne;

it's so simple it's easy :D

行雁书 2024-10-15 11:48:26

L"Hello World"

字符串前面的前缀 L 使其成为宽字符字符串。

L"Hello World"

the prefix L in front of the string makes it a wide char string.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文