[英]Reading \r (carriage return) vs \n (newline) from console with getc?
我正在写一个 function 基本上等待用户点击“输入”然后做一些事情。 我发现在测试时有效的是:
#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"
,对吗?
\n
是换行符,而\r
是回车符。 它们的用途不同。 Windows 使用\r\n
表示按下回车键,而 Linux 和 Unix 使用\n
表示按下回车键。
因此,我总是使用\n
因为它被所有人使用; if (x == '\n')
是测试字符相等性的正确方法。
'\n' 是“换行”,'\r' 是回车。 不同的操作系统会以不同的方式处理新行,例如
Windows
期望换行符是两个字符的组合,'\r\n'。
Linux\Unix 和现代 Mac OS
使用单个 '\n' 换行。
经典 Mac 操作系统
使用单个 '\r' 换行。
基本上,我会使用if (x == '\n')
因为它目前被所有现代操作系统使用。
表示新行有多个抽象级别 - 编程语言运行时、文本编辑器和操作系统。 CR(回车)和 LF(换行)是 ASCII 中定义的两个控制字符。 其他一些字符编码也可能定义“换行”字符。 任何键盘上的回车键都传达了“到下一行的开头”的意思。 键盘决定如何将 map 回车键输入到其对应的一个或多个控制字符。 有些键盘还区分 Enter 和 Return 键 - 让 Enter 键换行,Return 键回车。 在标准的 ANSI 键盘中,只有 Enter 键,它映射到 ASCII 中的回车符 (13)。 所以这是设备发送给操作系统的实际内容。 但是,不同的操作系统决定以不同方式解释 Enter 键。 因此,在类 Unix 系统中,任何回车符在交给接收输入的程序之前都会被转换为换行符(ASCII 中的 10)。 在 Windows 上,一个 CR 被翻译成两个字符——一个 CR 后跟一个 LF。 但是,您可以将输入 stream 设置为原始模式,在这种情况下,程序会获取键盘实际发送的内容。 现在编辑器开始发挥作用了。 当编辑器以原始模式从标准输入接收到 CR 时,它知道 CR 对应于键盘上的 Enter 键(关于键盘的假设)并且它应该在屏幕上显示一个新行。 在原始模式下,它应该调用写入系统调用 output 一个 CR + LF。 如果 output stream 不在原始模式下,文本编辑器应该 output 操作系统特定的序列,例如 linux 上的 LF。
最后,语言运行时也可以用自己的方式解释新行。 例如,C 标准说当以文本模式写入文件时,'\n' 被透明地转换为系统使用的本机换行符序列,它可能长于一个字符。 在文本模式下阅读时,本机换行符序列被转换回“\n”。 在二进制模式下,不进行翻译,'\n'产生的内部表示直接为output。 请注意,'\n' 和 '\r' 是特定于语言的字符,分别表示 LF 和 CR,它们在类 C 语言中很流行。 但并非每种语言都必须使用这种表示法。
对于第二个问题,“\n”是“\n”后跟一个“\0”终止符。 无法从控制台输入“\0”。
还要记住,如果您输入 25 个字符并按 Enter,第一个getc
将不会返回,直到输入所有 25 个字符并按 Enter。 在输入字符时读取字符需要特定于平台的代码。 因此,您最好通过对字符串执行fgets
、修剪换行符并将输入行作为一个整体来处理来读取整行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.