我正试图在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。所以我通过进入配置属性-> General --> Character Set来禁用Unicode,并尝试将其设置为Not Set或Multi Byte。但还是会遇到这个问题。
我知道禁用UNICODE是不好的,但我正试图了解我们公司写的一些遗留代码,这个实验是这个练习的一部分,有什么方法可以让cout命令成功打印szOldPath?
你的问题与Unicode无关。
\r
你的问题与Unicode无关。逃逸序列 为回车。 所以,你打印出来的是 "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)";