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

时间:2018-08-15 18:09:57

标签: c++

(a)

string str = "Hello\nWorld";

当我打印str时,输出为:

Hello
World

(b)

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

当我打印str时,输出为:

Hello\nWorld

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

7 个答案:

答案 0 :(得分:58)

提供控制字符时,C ++编译器具有某些规则-  documentation。如您所见,当您在字符串文字中指定if (subsriber?.isUnsubscribed == true && isDataEmpty()) { loadData() } 时,它会由编译器替换为换行符(ASCII值为0xa)。因此,您得到的不是2个符号\n\,而是一个带有二进制代码0xa的符号(我假设您使用ASCII编码),这使控制台在打印时将输出移至新行。读取字符串时,不会涉及编译器,并且字符串中包含实际的符号n\

答案 1 :(得分:15)

在字符串文字中指定时,“ \ n”将转换为匹配的ascii代码(在Linux上为n),并按原样存储。它不会存储为反斜杠,后跟原义0x0aEscape sequences只是为了您的方便,允许带有嵌入换行符的字符串文字。

另一方面,在终端中运行的shell不会进行此类替换:它会提交一个文字反斜杠和n,它们将按原样打印。

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

n

答案 2 :(得分:11)

cout <<“ Hello \ nworld”上的字符串由编译器转换为已编译的字符串,在其中将转义码转换为字符,因此cout函数在执行时不会看到两个字符“ \ n”字符串,但下一行字符的等效代码。

但是cin在运行时会获取每个键入字符的字符串,并且不会转换转义码。因此,如果要转换这些转义码,则必须创建替换函数。

答案 3 :(得分:7)

cin不包括C ++编译器。字符串文字中的转义序列是C ++的词法分析器的功能,它是C ++编译器的一部分。流或多或少地为您提供了来自操作系统的内容(它们可能会执行某些CRLF-> CR转换或基于操作系统的类似操作,仅此而已)。

答案 4 :(得分:5)

  

为什么我从cin阅读时转义符不起作用?

因为流阅读器被定义为这种方式。在核心,每个字符都是单独读取的。只有高级功能为字符提供了附加含义。

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

答案 5 :(得分:4)

字符串中的转义字符由编译器解释。序列\n由两个实际字符组成,编译器在编译过程中将其转换为单个换行符。在命令行上输入相同序列时,不会以任何方式解释该序列,因此将导致您输入的正是两个字符。

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

答案 6 :(得分:4)

在已编译的代码中,字符文字 ’\n’被特定于实现的值替换,运行时系统将其视为换行符。语言定义不需要任何特定值。

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