\
具有特殊含义。它通常会更改下一个字符的含义。示例:\n
表示换行,它实际上是一个ASCII字符。但是,由于\
的意思是“更改下一个字符”,而不是原义的\
字符?通过执行\
用\\
对其进行更改。这意味着“采用文字\字符”。[我正在看我的课程幻灯片中的一个例子,没有太多解释。
char getchar_escaped(void)
{
char c;
if ((c = getchar()) != '\\') return c;
switch ((c = getchar())) {
case '\\':
return '\\';
case 'n':
return '\n';
default:
return c;
}
}
这段代码究竟发生了什么?如何处理换行符和双斜杠?
在C
字符串文字和单字符常量中,有许多'特殊'字符无法在源代码文本中轻松表示。示例是newline字符,nul(终止符)字符和carriage-return。
该语言使我们的编码人员可以使用escape sequences来包含此类字符,这些字符是使用反斜杠字符(\
)输入的,后跟适当描述的“普通”字符。因此,我们可以使用转义的“ n”指定newline字符,如下所示:char NewLine = '\n';
类似地,nul和carriage-return字符由\0
表示和\r
分别。
但是,当我们实际上要指定反斜杠字符本身时,此约定会引起问题!因此,为了做到这一点,我们指定了一个转义序列,其中第二个字符是一个反斜杠。因此,代码 first 请随时要求进一步的澄清和/或解释。char BackSlash = '\\';
将反斜杠本身的值(可能是ASCII,但不一定是)分配给BackSlash
。在您的代码中,c = getchar()
之后的测试将检查输入的反斜杠字符-如果找到,则表示这些“转义序列”之一的开始-如果它不是] >找到,我们可以简单地返回实际的字符输入。但是,如果因此检测到转义序列的开始,则需要检查下一个字符:如果这是“ n”(case 'n':
),则返回代表换行符(return '\n';
)的转义序列;如果它是another反斜杠(case '\\':
),我们将返回实际反斜杠的序列(返回'\';)。在您的代码中未检测到其他标准转义序列,但是对它们进行进一步的检查很简单。
\
具有特殊含义。它通常会更改下一个字符的含义。示例:\n
表示换行,它实际上是一个ASCII字符。但是,由于\
的意思是“更改下一个字符”,而不是原义的\
字符?通过执行\
用\\
对其进行更改。这意味着“采用文字\字符”。char getchar_escaped(void)
{
char c;
// read a char from the input if it is the '\' character than return with it
if ((c = getchar()) != '\\') return c;
switch ((c = getchar())) { // read in another character
case '\\': return '\\'; // if it a '\' character then return '\'
case 'n': return '\n'; // if it an 'n' than return the new line character: '\n'
default: // otherwise
return c; // just return the character that was read
}
}
您发布的代码中反斜杠转义序列有两种不同的用法。
- C使用反斜杠转义序列作为C语言语法的一部分,以字符常量或字符串文字形式表示某些字符值。在字符常量或字符串文字中,序列
\\
表示单个反斜杠字符,而序列\n
表示单个换行符。 C语言中还有更多这些反斜杠转义序列。有关详细信息,请查阅C参考。
getchar_escaped
函数正在从标准输入中读取字符,并应用其自己的反斜杠转义规则,就涉及序列\\
和\n
而言,这些规则恰好与C语言本身的反斜杠转义规则匹配。如果当前未读取反斜杠转义序列,并且读取了反斜杠字符,则它将读取下一个字符并返回与反斜杠序列相对应的字符(例如,如果反斜杠后面的字符为n
,则返回换行符)。 (实际上,n
是唯一不映射到相同字符的字符。处理反斜杠后跟反斜杠的特殊情况是多余的。)\
具有特殊含义。它通常会更改下一个字符的含义。示例:\n
表示换行,它实际上是一个ASCII字符。但是,由于\
的意思是“更改下一个字符”,而不是原义的\
字符?通过执行\
用\\
对其进行更改。这意味着“采用文字\字符”。