35

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

#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"从控制台输入,对吗?

4

4 回答 4

61

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

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

于 2012-04-07T23:21:37.330 回答
18

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

视窗

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

Linux\Unix 和现代 Mac OS

使用单个 '\n' 换行。

经典 Mac 操作系统

使用单个 '\r' 换行。

基本上,我会使用if (x == '\n')所有现代操作系统目前都在使用的方式。

于 2012-04-07T23:24:24.143 回答
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。如果输出流不是原始模式,文本编辑器应该输出操作系统特定的序列,例如 linux 上的 LF。

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

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

于 2018-01-07T18:40:53.453 回答
3

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

于 2012-04-08T04:56:08.473 回答