我正在写一个基本上等待用户点击“输入”然后做某事的功能。我发现在测试时有效的方法如下:
#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"
,对吗?
答案 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'。