【问题标题】:Garbled character output when using cout API使用 cout API 时输出乱码
【发布时间】:2020-04-22 10:00:55
【问题描述】:

我正在尝试在 VS 2015 中运行这个简单的代码

#include "stdafx.h"
# include <iostream>

int main()
{
    char * szOldPath = "\"C:\icm\scripts\StartupSync\runall.bat\" nonprod"; 
    std::cout << szOldPath << std::endl;

    return 0;
}

但是,szOldPath的输出不正确,控制台正在打印--

unall.bat" nonprodupSync

我怀疑这可能是因为 Unicode,我应该使用 wcout。因此,我通过转到配置属性-> 常规-> 字符集禁用了 Unicode,并尝试将其设置为未设置或多字节。但是还是遇到了这个问题。

我知道禁用 UNICODE 不好,但我正在尝试理解我们公司编写的一些遗留代码,这个实验是这个练习的一部分,有什么方法可以让 cout 命令成功打印 szOldPath?

【问题讨论】:

  • 您需要对一些以 `\` 字符开头的序列进行转义,因为它们构成了有效的转义序列:en.cppreference.com/w/cpp/language/escape
  • 理查德,感谢您的及时答复。我还有一个后续问题,如果我们使用 count 而不是 wcout,我们应该始终禁用 UNICODE 对吗?
  • 您可以毫无问题地混合coutwcout,只要您将正确类型的字符串传递给它们。

标签: c++ windows visual-studio winapi


【解决方案1】:

您的问题与 Unicode 无关。

\r 是用于回车的escape sequence。因此,您打印出"C:\icm\scripts\StartupSync,然后\r 告诉终端将光标移回当前行的开头,然后打印unall.bat" nonprod,覆盖已经存在的内容。

您需要转义字符串文字中的所有 \ 字符,就像您必须转义 " 字符一样。

此外,在将字符串文字分配给指针时,您的变量需要声明为指向const char 的指针。这是在 C++11 及更高版本中强制执行的:

#include "stdafx.h"
#include <iostream>

int main()
{
    const char * szOldPath = "\"C:\\icm\\scripts\\StartupSync\\runall.bat\" nonprod"; 
    std::cout << szOldPath << std::endl;

    return 0;
}

或者,在 C++11 及更高版本中,您可以使用 原始字符串文字 来避免转义任何带有前导 \ 的字符:

const char * szOldPath = R"("C:\icm\scripts\StartupSync\runall.bat" nonprod)"; 

【讨论】:

    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 2015-07-27
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    相关资源
    最近更新 更多