在C中处理反斜杠转义序列

问题描述 投票:1回答:3

[我正在看我的课程幻灯片中的一个例子,没有太多解释。

char getchar_escaped(void)
{
   char c;
   if ((c = getchar()) != '\\') return c;

   switch ((c = getchar())) {
     case '\\':
       return '\\';
     case 'n':
       return '\n';
     default:
       return c;
   }
}

这段代码究竟发生了什么?如何处理换行符和双斜杠?

c escaping backslash html-escape-characters
3个回答
1
投票

C字符串文字和单字符常量中,有许多'特殊'字符无法在源代码文本中轻松表示。示例是newline字符,nul(终止符)字符和carriage-return

该语言使我们的编码人员可以使用escape sequences来包含此类字符,这些字符是使用反斜杠字符(\)输入的,后跟适当描述的“普通”字符。因此,我们可以使用转义的“ n”指定newline字符,如下所示:char NewLine = '\n';类似地,nulcarriage-return字符由\0表示和\r分别。

但是,当我们实际上要指定反斜杠字符本身时,此约定会引起问题!因此,为了做到这一点,我们指定了一个转义序列,其中第二个字符是一个反斜杠。因此,代码char BackSlash = '\\';将反斜杠本身的值(可能是ASCII,但不一定是)分配给BackSlash在您的代码中,

first

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 } }

您发布的代码中反斜杠转义序列有两种不同的用法。

  1. C使用反斜杠转义序列作为C语言语法的一部分,以字符常量或字符串文字形式表示某些字符值。在字符常量或字符串文字中,序列\\表示单个反斜杠字符,而序列\n表示单个换行符。 C语言中还有更多这些反斜杠转义序列。有关详细信息,请查阅C参考。

  • 程序的getchar_escaped函数正在从标准输入中读取字符,并应用其自己的反斜杠转义规则,就涉及序列\\\n而言,这些规则恰好与C语言本身的反斜杠转义规则匹配。如果当前未读取反斜杠转义序列,并且读取了反斜杠字符,则它将读取下一个字符并返回与反斜杠序列相对应的字符(例如,如果反斜杠后面的字符为n,则返回换行符)。 (实际上,n是唯一不映射到相同字符的字符。处理反斜杠后跟反斜杠的特殊情况是多余的。)

  • 0
    投票
    \具有特殊含义。它通常会更改下一个字符的含义。示例:\n表示换行,它实际上是一个ASCII字符。但是,由于\的意思是“更改下一个字符”,而不是原义的\字符?通过执行\\\对其进行更改。这意味着“采用文字\字符”。

    0
    投票
    您发布的代码中反斜杠转义序列有两种不同的用法。
    © www.soinside.com 2019 - 2024. All rights reserved.