使用getc从控制台读取\ r(回车)vs \ n(换行符)?

时间:2012-04-07 23:15:53

标签: c console newline getc

我正在写一个基本上等待用户点击“输入”然后做某事的功能。我发现在测试时有效的方法如下:

#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 个答案:

答案 0 :(得分:38)

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

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

答案 1 :(得分:13)

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

<强>窗

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

Linux \ Unix和Modern Mac OS

使用单个'\ n'表示新行。

经典Mac OS

使用单个'\ r'表示新行。

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

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