【问题标题】:Reading \r (carriage return) vs \n (newline) from console with getc?使用 getc 从控制台读取 \r(回车)与 \n(换行符)?
【发布时间】:2012-04-20 23:53:52
【问题描述】:

我正在编写一个基本上等待用户点击“输入”然后执行某些操作的函数。我发现在测试时有效的是:

#include <stdio.h>

int main()
{
        int x = getc(stdin);
        if (x == '\n') {
                printf("carriage return");
                printf("\n");
        }
        else {
                printf("missed it");
                printf("\n");
        }
}

我有一个问题,我最初尝试做的是:if (x == '\r') 但在测试中,程序没有让我按回车键。 '\n' 似乎对应于我从控制台输入。有人可以解释其中的区别吗?另外,为了验证,将其写为if... == "\n" 是否意味着字符串文字?也就是说,用户实际上必须从控制台输入"\n",对吗?

【问题讨论】:

  • C 对单引号和双引号文字都应用转义,因此“\n”是长度为两个字符的字符串,第一个是 ASCII 代码 10(\n 本身),第二个是 ASCII NUL(空终止符) .
  • (希望您不要介意对标题的修改,它们是为了使其更易于搜索。)
  • 你不能使用 == 在 C 中测试字符串是否相等,你必须使用 strcmp 或类似的。 char *s1, *s2; if (s1 == s2) {...} 只会检查 s1s2 是否指向同一内存区域,而不管实际内存内容如何。
  • 如果您的标准输入以文本模式打开,那么您的应用程序将总是看到\n 换行,无论\n 在您的执行字符集中表示什么意思,并且但是平台会序列化换行符。

标签: c console newline getc


【解决方案1】:

\n 是换行符,\r 是回车符。它们的用途不同。 Windows 使用\r\n 表示按下回车键,而Linux 和Unix 使用\n 表示按下回车键。

因此,我总是使用\n,因为它被所有人使用;而if (x == '\n') 是测试字符相等性的正确方法。

【讨论】:

    【解决方案2】:

    “\n”是“换行”,“\r”是回车。不同的操作系统会以不同的方式处理新行,比如

    Windows

    期望换行符是两个字符的组合,'\r\n'。

    Linux\Unix 和现代 Mac OS

    使用单个 '\n' 换行。

    经典 Mac 操作系统

    使用单个 '\r' 换行。

    基本上,我会使用if (x == '\n'),因为它目前被所有现代操作系统使用。

    【讨论】:

    • Mac 因版本而异newline
    • 我猜您的意思是 Classic Mac OS 用于 '\r' 换行符,因为现代 Mac OS X 是 UNIX 并使用 '\n' 换行符。
    【解决方案3】:

    还请记住,如果您输入 25 个字符并回车,则在输入所有 25 个字符并按 Enter 之前,第一个 getc 不会返回。在键入时读取字符需要特定于平台的代码。因此,您最好通过在字符串中执行fgets、修剪换行符并将输入行作为一个整体来处理来读取整行。

    【讨论】:

      【解决方案4】:

      表示新行有几个抽象级别 - 编程语言运行时、文本编辑器和操作系统。 CR(回车)和 LF(换行)是用 ASCII 定义的两个控制字符。其他一些字符编码也可能定义一个“新行”字符。任何键盘上的 Enter 键都传达了“到下一行的开头”的含义。键盘决定如何将 Enter 键映射到其相应的控制字符。一些键盘还区分 Enter 和 Return 键 - 让 Enter 键为换行,Return 键为回车。在标准的 ANSI 键盘中,只有 Enter 键,它映射到 ASCII 中的回车符 (13)。所以这是设备发送到操作系统的实际内容。但是,不同的操作系统决定以不同的方式解释 Enter 键。因此,在类 Unix 系统中,任何回车都被转换为换行符(ASCII 中的 10),然后再交给接收输入的程序。在 Windows 上,一个 CR 被翻译成两个字符 - 一个 CR 后跟一个 LF。但是,您可以将输入流设置为原始模式,在这种情况下,程序会获取键盘实际发送的内容。现在编辑器开始发挥作用。当编辑器以原始模式从标准输入接收到 CR 时,它知道 CR 对应于键盘上的 Enter 键(关于键盘的假设)并且应该在屏幕上显示一个新行。在 raw 模式下,它应该调用 write 系统调用来输出一个 CR + LF。如果输出流不是 raw 模式,文本编辑器应该输出 OS 特定的序列,例如 linux 上的 LF。

      最后,语言运行时也可以以自己的方式解释新行。例如,C 标准说当以文本模式编写文件时,'\n' 被透明地翻译为系统使用的本机换行序列,它可能长于一个字符。在文本模式下阅读时,本机换行序列被翻译回'\n'。在二进制模式下,不进行翻译,直接输出'\n'产生的内部表示。请注意,'\n' 和 '\r' 是特定于语言的字符,分别表示在类 C 语言中流行的 LF 和 CR。但并非每种语言都必须使用这种表示法。

      对于第二个问题,“\n”是 '\n' 后跟一个 '\0' 终止符。无法从控制台输入“\0”。

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 1970-01-01
        • 2012-06-15
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        相关资源
        最近更新 更多