【问题标题】:I can't output a string with wcout我无法用 wcout 输出字符串
【发布时间】:2015-12-02 07:16:08
【问题描述】:

这是this question 的一种复制品。我遵循了建议(我认为)并包含了 <string> 但完全相同的错误出现在我的脸上:

error C2679: binary '

#include <string>
#include <iostream>

using namespace std;

int main() {
    string texte;
    texte = "pouet";
    wcout << texte << endl;
    return 0;
}

编辑:我一点也不自豪地说这个问题是由于我没有选择正确的项目作为“起始项目”而引起的。 Visual Studio 有点难以理解……但是,最初的真正问题涉及我的实际项目,并且是关于无法通过wcout 输出的标准字符串。我重新格式化了问题以相应地重新定位主题。随心所欲地给我投反对票,这是我应得的……

【问题讨论】:

标签: c++ string visual-studio-2013 cout


【解决方案1】:

std::basic_string 的输出运算符没有重载以对流的任意字符类型进行操作。您的选择是:

  • 从您的std::string 创建一个std::wstring,例如:

    std::wcout << std::wstring(texte.begin(), texte.end());
    
  • 由于输出操作符对于 C 风格的字符串是重载的,即使字符类型不匹配,你也可以得到一个字符数组:

    std::wcout << texte.c_str();
    

【讨论】:

    【解决方案2】:

    这在我的 CLion 上使用最新的 MinGW 编译并运行良好

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main() {
        string texte;
        texte = "pouet";
        cout << texte << endl;
        return 0;
    }
    

    对于 wcout,也就是宽字符串,这应该提供正确的输出:

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main() {
        wstring texte;
        texte = L"pouet";
        wcout << texte << endl;
        return 0;
    }
    

    cout 输出具有 1 字节宽字符(通常为 ASCII)的“常规”字符串,而 wcout 用于由表示占用超过 1 个字节的字符组成的“宽”字符串。

    【讨论】:

    • 我应该使用 wcout 进行法语写作。不幸的是,您提出的解决方案都不适合我……
    • "'常规'字符串,字符为 1 字节宽(通常为 ASCII)。"仅限于 ASCII 的程序根本不常见。几乎可以肯定不会在支持 wcout 的系统上。
    • 对,但是 string 是一个字符数组,并且 char 被定义为具有 CHAR_BIT 位(在 POSIX 编译系统中要求为 8),因此“常规”字符在大多数情况下是 8 位宽的。在实践中,这 8 个字节使用 ASCII 或前 128 的任何兼容编码进行编码(你不能真的说 UTF-8 或任何 Unicode 编码通常不同于前 128 个字符的 ASCII),有可能将其扩展为另外128个字符。考虑到 UTF-8 是大多数事物的事实上的默认编码,尤其是网络,这样的“扩展”将是非常危险的,并且根据我的经验并没有被广泛使用
    • (宽字符/字符串和 wcout 完全是不同的故事,恕我直言,应该在任何打算翻译的程序中使用)
    【解决方案3】:

    如果你使用 wcout,你也必须使用 wstring,你必须在你的 const 字符串前面放一个 'L'。

    wstring texte;
    texte = L"pouet";
    wcout << texte << endl;
    

    【讨论】:

      【解决方案4】:

      你嫁给字符串类型了吗?您可以通过将 texte 设为 char* 而不是字符串来做您想做的事情:

      char* texte = "pouet";
      

      【讨论】:

      • 结束不是字符串吗?
      • “字符串”是一个带有方法的对象,围绕 char 原语构建。一个 char 数组(在我的建议中,一个由 char* 指向的常量数组)是一个非常不同意义上的“字符串”——它不是一个对象,它没有方法;它只是一个存储数据的裸存储空间。
      • 感谢您的澄清。但是,这仍然不起作用
      • 如果您使用“字符串”类型,那么您的编译器将使用该对象。如果您使用 char[...] 或 char* 作为您的类型,那么编译器将使用一个字符数组,它通常被称为“字符串”,但与“字符串”类型不同。 .
      • 你没有浪费我们的时间——你给了我们一些值得思考的东西。我不能代表任何人发言,但我肯定不会在这里投票! 8)
      猜你喜欢
      • 1970-01-01
      • 2021-01-07
      • 2021-10-02
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多