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

【问题讨论】:

    标签: c++ string 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 。这只是我正在传递的一些参数。但我按照我的方式编写代码以保持简单:)
    猜你喜欢
    • 2019-11-17
    • 2018-07-01
    • 2010-12-22
    • 2015-04-25
    • 1970-01-01
    • 2021-10-19
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多