C++ 当我阅读cin时,为什么转义字符不起作用?

C++ 当我阅读cin时,为什么转义字符不起作用?,c++,C++,(a) 当我打印str时,输出为: string str = "Hello\nWorld"; string str; cin >> str; //given input as Hello\nWorld (b) 当我打印str时,输出为: string str = "Hello\nWorld"; string str; cin >> str; //given input as Hello\nWorld 在提供控制字符时,C++编译器有一定的规则。

(a)

当我打印
str
时,输出为:

string str = "Hello\nWorld";
string str;
cin >> str;      //given input as Hello\nWorld
(b)

当我打印
str
时,输出为:

string str = "Hello\nWorld";
string str;
cin >> str;      //given input as Hello\nWorld

<(a)和(b)有什么区别?

< P>在提供控制字符时,C++编译器有一定的规则。
. 如您所见,当您在字符串文本中指定
\n
时,它将被带换行符的编译器替换(ASCII值为0xa)。因此,您得到的不是两个符号,
\
n
,而是一个二进制代码为0xa的符号(我假设您使用ASCII编码),这使得控制台在打印时将输出移动到新行。读取字符串时,编译器不参与,字符串中包含实际符号
\
n

在字符串文本中指定时,“\n”将转换为匹配的ascii代码(linux上为
0x0a
),并按原样存储。它不会存储为反斜杠,后跟文字
n
。仅为方便起见,允许使用嵌入换行符的字符串文字

另一方面,在终端中运行的shell不会进行这种替换:它会提交一个文本反斜杠和
n
,并将其打印出来

要打印换行符,请输入换行符:

Hello\nWorld

<代码> CIN < /C>不包含C++编译器。字符串字符串中的转义序列是C++的LycER的一个特性,它是C++编译器的一部分。流或多或少地为您提供了来自操作系统的内容(它们可以根据操作系统执行一些CRLF->CR翻译或类似操作,但仅此而已)。

字符串中的转义字符由编译器解释。序列
\n
由两个实际字符组成,编译器在编译期间将其转换为单个换行符。在命令行中输入相同的序列时,不会以任何方式对其进行解释,因此会产生您输入的两个字符

如果您想处理字符串以解释转义序列,则必须自己处理(或使用适当的库)。

cout上的字符串 当我阅读cin时,为什么转义字符不起作用

因为流读取器就是这样定义的。在内核中,每个字符都是单独读取的。只有更高级别的函数为字符提供了额外的含义


当编译器处理字符串literal
“Hello\nWorld”
时,其文件读取器也会向其传递两个字符。只有C++编译器/解析器根据语言的规则将它们翻译成一个字符。在编译代码中

< P>,<强>字符字符< /强>代码> > \'\/C>被运行时系统当作换行符的实现特定值替换。语言定义不需要任何特定值


从控制台或文件读取输入时,传入文本未被编译,字符序列“\n”没有任何特殊含义。它只是两个字符。

虽然
echo
的实现因计算机而异,
echo-e“hello\nworld”
是一种非常可靠的方法,可以将
\n
解释为换行符。如果没有,则如果您的计算机上有
printf
,则
printf“hello\nworld\n”
可以保证工作。不是ASCII码,“执行字符集”(字符编码)-,几乎肯定不是ASCII码(即使对于此字符,代码可能是相同的)。特别是,仍有一些计算机在运行,其中执行字符集为EBCDIC,“\n”与0x0a完全不同。最好知道如何从终端输入文字换行符:在大多数终端中,先按Ctrl+V,然后按Ctrl+J。@BallpointBen,
printf
(命令行实用程序)是标准的,因此您很可能拥有它(可能内置于shell中)。
echo-e
非常常见,但Dash(Debian的/Ubuntu的
/bin/sh
)不善待它。然后有“代码”> $'..…/Cord>引用,它处理C样式的逸出。它不是标准的,所以DASH也不支持它,但是几乎所有其他shell都支持它。完全正确。转义代码是源代码分析器的一个特性,不是C++字符串数据的一个特征。语言定义没有。需要
'\n'
@PeteBecker的任何特定值:答案是它给出的值是ASCII,几乎涵盖了所有现代SBCS系统。使用其他字符集的人必须自己找到适用的值。@PeteBecker:在Windows上,
“\n”
{0x0A,0x00}
也是。它是文件(或控制台)I/O将其转换为0D 0A……对于C++程序来说,它只是一个。您可以有一个系统,其中代码“> \n’/Cube是-2,当然,但这不是ASCII系统。标准保证字符逃逸被转换为执行字符集的相应值。如果执行字符集是A。SCII,
'\n'==10
,保证。@PeteBecker:LF是字符代码的名称。括号不是代码名称的一部分,它们表示附加信息。但我的要点是:
'\n'
始终是一个字符。编译器不能将其转换为CR-LF对。如果执行字符集是ASCII,则当一个字符
\n
必须是0A时。如果执行字符集是EBCDIC,则显然会有所不同。但是换行符转换与字符串文本完全无关。在Linux上,您可以
回显-e“Hello,\nWorld”|./testprogram
将转义字符转换为换行符,而不是文本标记
`和
n`,然后再将其传递给程序。。。