为啥下面的 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:天哪!我习惯为资源编写包装器,所以我不经常写delete
或delete[]
。 :-) 感谢您指出了这一点。 @Billy ONeal:是的,如果 OP 打算做任何可能在 if
块内引发异常的事情,那么某种形式的 RAII 可能对此有用。【参考方案3】:
L“你好世界”
字符串前面的前缀 L 使它成为一个宽字符字符串。
【讨论】:
没错,但它会使问题变得微不足道,而不是调用转换函数...... 其实 char src 是我无法控制的。应该在问题中提到。所以我不能在它前面添加 L 。这只是我正在传递的一些参数。但我按照我的方式编写代码以保持简单:)以上是关于为啥下面的 C++ 代码只打印第一个字符?的主要内容,如果未能解决你的问题,请参考以下文章
c语言中连续3个if语句 三种情况,大于等于小于0,为啥只执行第一个if就不执行下面的了?请问