繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM