CR、LF 还是 CRLF ?

此文章所描述的内容适用于C语言,C++也可参考

gcc可能不会将字面串中的\r或\n根据所在操作系统替换

这意味着C代码中的\r\n在程序运行时就真的是单一回车符CR和单一换行符LF

可以用gcc编译以下代码,运行编译得到的二进制文件,看看结果如何:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    FILE * f = fopen("test","w+");
    fprintf(f , "\n\r\r\n");
    fclose(f) , f = NULL;
    //将\n、\r和\r\n输出到文件中

    f = fopen("test","r");

    int asc;
    while((asc = fgetc(f)) != -1)
    {
        printf("%d\n", asc);
    }
    //打开文件看看是否是LF、CR和CRLF

    fclose(f) , f = NULL;    
    printf("Press enter to continue...");
    getchar();
    return 0;
}

如果你的运行结果是这样:

10
13
13
10
Press enter to continue...

那么你所使用的gcc看起来并没有对转义字符\r\n根据你所使用的操作系统进行替换

记事本可能会自动将CR、LF、CRLF都视为换行

至少,我在当前最新的win10版本中的记事本上发现了这一点:记事本会将打开的文件中存在的CRLFCRLF
都统一视为 换到下一行的行首

!记事本只是在显示效果上做了处理,并不会把文件中的CR、LF、CRLF都替换成CRLF!

windows控制台IO库conio.h中的getch()和getche()

当我们在windows控制台程序中调用getch()getche()后,程序会被阻塞,等待用户按键,此时按下回车键
序只会接收到CR,回显亦只有控制台下CR的效果(光标回车不换行)

windows控制台如何显示CR、LF、CRLF

CR:光标回到当前光标所在行行首
LF:光标去到当前光标所在行的下一行行首
CRLF:先显示CR,再显示LF

我们能输入什么

无论是按一下回车键还是向windows控制台粘贴一个windows换行符,我们都只能向控制台标准输入流中输入一
LF

按键与输入有什么不同

getch()getche()阻塞地监听一个按键,返回的是用户按下键的键码,回显的是此键码对应的字符
getchar()获取用户的输入,用户的按下特定键会输入什么是不固定的,可以被多种因素影响,所有的标准输入函
数在用户输入时都有回显,回显的是用户输入的字符

按下回车键,getch()getche()监听到的是回车键,键码是13,对应字符CR,回显是CR
按下回车键,getchar()获取到的是用户按下回车键所输入的LF,回显是LF

由上一点我们能想到什么

getch()getche()监听用户按键,不存在缓冲区,每次调用都一定会阻塞,直到用户按下某个键后立即返回

所以,一些小伙伴们不要再试图通过清空标准输入缓冲区来跳过 getch() 和 getche() 的阻塞啦 ~

小技巧

仅使用一行代码便可清空标准输入缓冲区

rewind(stdin);

最后


#include 转载请注明出处哦

https://blog.csdn.net/weixin_43737206/article/details/99196571

fprintf(点个好看吧 , "嘿嘿");

发布了19 篇原创文章 · 获赞 23 · 访问量 3900

猜你喜欢

转载自blog.csdn.net/weixin_43737206/article/details/99196571