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

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

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

我的问题,以及我最初尝试的是: if (x == '\r')但是在测试中,程序没有抓住我进入。 '\n'似乎对应于我从控制台点击进入。 有人可以解释这个区别吗? 另外,要进行validation,将其写为if... == "\n"将表示字符串文字? 即用户真的必须从控制台输入"\n" ,对吗?

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

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

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

视窗

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

Linux \ Unix和Modern Mac OS

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

经典Mac OS

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

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

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

使用gets()打开缓冲区溢出攻击,因此可能会发生shell代码攻击。 您应该使用fgets()并传入缓冲区大小。

表示新行的几个级别的抽象 – 编程语言运行时,文本编辑器和操作系统。 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上输出特定于OS的序列,例如LF。

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

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