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

Posted

技术标签:

【中文标题】为啥下面的 C++ 代码只打印第一个字符?【英文标题】:Why is the following C++ code printing only the first character?为什么下面的 C++ 代码只打印第一个字符? 【发布时间】:2011-05-28 09:40:58 【问题描述】:

我正在尝试将 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 的正确方法吗?从那以后我知道了另一种方式。但我想知道为什么上面的代码会这样工作?

【问题讨论】:

【参考方案1】:

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

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

wcout << dne;

它很简单很容易:D

【讨论】:

+1 没错,您的代码看起来也更优雅。但我只是在学习 C 和 C++(不是生产代码)。所以我故意在玩弄东西。动机是了解事情是如何运作的,而不是简单地让他们以更好的方式完成:) 不过谢谢。【参考方案2】:

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())来处理语言环境问题。

【讨论】:

@Billy ONeal:谢谢。欣赏它。 :-) 请注意,if 中的所有内容都不能抛出,否则会泄漏。改用std::vector 可能更好。 @Gene Bushuyev:天哪!我习惯为资源编写包装器,所以我不经常写deletedelete[]。 :-) 感谢您指出了这一点。 @Billy ONeal:是的,如果 OP 打算做任何可能在 if 块内引发异常的事情,那么某种形式的 RAII 可能对此有用。【参考方案3】:

L“你好世界”

字符串前面的前缀 L 使它成为一个宽字符字符串。

【讨论】:

没错,但它会使问题变得微不足道,而不是调用转换函数...... 其实 char src 是我无法控制的。应该在问题中提到。所以我不能在它前面添加 L 。这只是我正在传递的一些参数。但我按照我的方式编写代码以保持简单:)

以上是关于为啥下面的 C++ 代码只打印第一个字符?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中连续3个if语句 三种情况,大于等于小于0,为啥只执行第一个if就不执行下面的了?请问

c语言中连续3个if语句 三种情况,大于等于小于0,为啥只执行第一个if就不执行下面的了?请问

为啥当我为 C++ 代码打印字符时,我的终端会发出哔声?

c++ fstream::read 只返回第一个字符

sql查询只打印第一行

C++信奥赛题目——第一个只出现一次的值