使用cout API时出现字符输出错误

Garbled character output when using cout API

本文关键字:字符 输出 错误 cout API 使用      更新时间:2024-03-28

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

#include "stdafx.h"
# include <iostream>
int main()
{
char * szOldPath = ""C:icmscriptsStartupSyncrunall.bat" nonprod"; 
std::cout << szOldPath << std::endl;
return 0;
}

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

unall.bat" nonprodupSync

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

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

您的问题与Unicode无关。

r是回车的转义序列。因此,打印"C:icmscriptsStartupSync,然后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:icmscriptsStartupSyncrunall.bat" nonprod)";