【问题标题】:Handling Backslash Escape Sequences in C在 C 中处理反斜杠转义序列
【发布时间】:2020-02-13 17:39:01
【问题描述】:

我正在查看课程幻灯片中的一个示例,但没有提供太多解释。

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

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

这段代码到底发生了什么?这是如何处理换行符和双斜杠的?

【问题讨论】:

  • Try explaining the code out loud for your rubber duck(或合适的替代品,如室友、朋友、重要的其他人等)。
  • 这个开关很浪费——case '\\': return '\\'; 等同于default:,所以你可以用if ((c = getchar()) == 'n') return '\n'; return c; 代替switch。基本上,如果输入包含一个反斜杠,后跟一个n,则该函数返回'\n'(换行符);对于任何其他反斜杠 X 序列,它会删除前导反斜杠并返回 X。代码无法正确处理 EOF。应该是int c(函数的返回类型也应该是int);如果其中一个读取遇到 EOF,则代码将(大部分是巧合地)返回 EOF。

标签: c escaping backslash html-escape-characters


【解决方案1】:

C 字符串文字和单字符常量中,有许多“特殊”字符无法在源代码文本中轻松表示。例如 newline 字符、nul(终止符)字符和 回车

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

然而,当我们真正想要指定 反斜杠 字符本身时,这种约定会导致问题!因此,为了做到这一点,我们指定了一个转义序列,其中第二个字符是也是一个反斜杠;因此,代码char BackSlash = '\\'; 将反斜杠本身的值(可能是ASCII,但不一定如此)分配给BackSlash

在您的代码中,first c = getchar() 之后的测试会检查输入反斜杠字符 - 如果找到,则表示这些“转义序列”之一的开始 - 如果它 没有找到,我们可以简单地返回实际的字符输入。然而,如果我们因此检测到转义序列的开始,我们需要检查下一个字符:如果这是一个“n”(case 'n':),我们返回表示换行符的转义序列(return '\n';);如果是另一个反斜杠(case '\\':),我们返回实际反斜杠的序列(返回'\';)。

在您的代码中未检测到其他标准转义序列,但为这些添加进一步检查将是微不足道的。

请随时要求进一步澄清和/或解释。

【讨论】:

    【解决方案2】:

    \ 有特殊含义。它通常会改变下一个字符的含义。示例:\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
       }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      2. 1234563如果它当前没有读取反斜杠转义序列并且它读取了一个反斜杠字符,它会读取下一个字符并返回一个与反斜杠序列相对应的字符(例如,如果反斜杠后面的字符是n,则返回一个换行符)。 (事实上​​,n 是唯一一个不映射到相同字符的字符。处理反斜杠后跟反斜杠的特殊情况是多余的。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 2017-12-27
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2021-06-19
        相关资源
        最近更新 更多