当我从cin读取时,为什么转义字符不起作用?

kra*_*ram 40 c++

(一个)

string str = "Hello\nWorld";
Run Code Online (Sandbox Code Playgroud)

当我打印时str,输出是:

Hello
World
Run Code Online (Sandbox Code Playgroud)

(b)中

string str;
cin >> str;      //given input as Hello\nWorld
Run Code Online (Sandbox Code Playgroud)

当我打印时str,输出是:

Hello\nWorld
Run Code Online (Sandbox Code Playgroud)

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

Sla*_*ica 58

当提供控制字符时,C++编译器具有某些规则 - 文档.如您所见,当您\n在字符串文字中指定时,它将被编译器替换为换行符(ASCII的值为0xa).因此,而不是2个符号,\并且n,您得到一个带有二进制代码0xa的符号(我假设您使用ASCII编码),这使得控制台在打印时将输出移动到新行.当你读一个字符串的编译器是不参与,你的字符串的实际符号\,并n在里面.

  • 非常正确.转义码是**源代码解析器**的一个特性,而不是C++字符串数据的一个特性. (8认同)
  • @PeteBecker:在Windows上,`"\n"`也是``{0x0A,0x00}`.它是文件(或控制台)I/O将其转换为0D 0A ...出于C++程序的目的,它只是一个.你可以有一个''\n'`为-2的系统,当然,但这不是一个ASCII系统.该标准保证字符转义转换为执行字符集中的相应值.如果执行字符集是ASCII,则''\n'== 10`,保证. (3认同)
  • 语言定义不需要''\ n'`的任何特定值。 (2认同)
  • @PeteBecker:LF是字符代码的名称.括号不是代码名称的一部分,它们表示其他信息.但我的主要观点是:''\n'`总是一个字符.编译器不得将其转换为CR-LF对.如果执行字符集是ASCII,那么一个字符"\n"必须是0A.如果执行字符集是EBCDIC,那么显然它会有所不同.但换行翻译与字符串文字完全无关. (2认同)

ere*_*non 15

当在字符串文字中指定时,"\n"将被转换为匹配的ascii代码(0x0a在linux上),并按原样存储.它不会被存储为反斜杠,后面是文字n.转义序列仅为方便起见,允许带有嵌入换行符的字符串文字.

另一方面,在终端中运行的shell不会进行这样的替换:它提交一个文字反斜杠n,并且将这样打印.

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

$ echo "Hello
 World" | ./your-program 
Run Code Online (Sandbox Code Playgroud)

  • 不是ASCII码,"执行字符集"(字符编码) - 几乎肯定不是ASCII(即使对于这个字符,代码可能是相同的). (2认同)

Kri*_*ary 11

cout <<"Hello \nworld"中的字符串由编译器转换为编译字符串,其中转义码转换为字符,因此执行时的cout函数不会看到两个字符串"\n"字符串,而是等效代码下一行字符.

但是cin 在运行时获取每个类型字符的字符串,并且不转换转义码.因此,如果要转换这些转义码,则必须进行替换功能.


PSk*_*cik 7

cin不包括C++编译器.字符串文字中的转义序列是C++的词法分析器的一个特性,它是C++编译器的一部分.Streams或多或少会给你来自操作系统的内容(他们可能会根据操作系统进行一些CRLF - > CR翻译或类似操作,但就是这样).


R S*_*ahu 5

当我从cin读取时,为什么转义字符不起作用?

因为流阅读器被定义为这种方式.核心是每个字符分别阅读.只有更高级别的功能才能为角色提供额外的意义.

当编译器处理字符串文字时"Hello\nWorld",其文件阅读器也会传递两个字符.只有C++编译器/解析器根据语言规则将它们转换为一个字符.