我们使用printf打印时基本都会用到 \n 和 \r 之类控制字符,比如:

printf("hello world!\r\n");

那你知道这些 \n 和 \r 的区别吗?

# 关于 \n  和「 \r 

在ASCII码中,我们会看到有一类不可显示的字符,叫控制字符,其中就包含\r 和 \n 等控制字符。

\n : 换行符(newline),另起一行,对应ASCII值10(缩写:LF)。

\r : 回车符(return),回到一行的开头,对应ASCII值13(缩写:CR)。

回车和换行来源:

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意儿,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。

这就是"换行"和"回车"的来历,从它们的英语名字上也可以看出一二。

「 \n 」 和 \r 差异

后来,计算机发明了,这两个概念也就被搬到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。

'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。

有的编辑器只认\r\n,有的编辑器则两个都认。所以要想通用的话,最好用\r\n换行。

  • 在微软的MS-DOS和Windows中,使用“回车CR('\r')”和“换行LF('\n')”两个字符作为换行符;

  • Windows系统里面,每行结尾是 回车+换行(CR+LF),即“\r\n”;

  • Unix系统里,每行结尾只有 换行CR,即“\n”;

  • Mac系统里,每行结尾是 回车CR 即'\r';

  • 所以我们平时编写文件的回车符应该确切来说叫做回车换行符;

#影响

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

Linux保存的文件在windows上用记事本看的话会出现黑点。这个应该很多人都看到过,比如,Keil代码中直接显示换行符:

互相转换

在linux下,命令unix2dos 是把linux文件格式转换成windows文件格式,命令dos2unix 是把windows格式转换成linux文件格式。

在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化。

如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本。一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。

示例代码:

#include "stdio.h"int main()
{printf("hello,World");printf("\n");printf("\t");printf("#");printf("\r");printf("@"); return 0;
}

图解:

程序输出:

转自:strongerHuang

  推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

文本或代码中 \n 和 \r 的区别相关推荐

  1. python中%s和%r的区别

    %s和%r的区别 %s和%r都可以用来转换字符串 %s -> str() %r -> repr() 具体区别如下: s = 'hello' # repr和str打印字符串结果 print( ...

  2. HTML中nbsp 和空格的区别?

    在html代码中,使用转义字符&nbsp表示1个空格,而使用转义字符&amp表示 &. 1.在html代码中&nbsp和空格的区别: 在html代码中每输入一个转义字符 ...

  3. php代码中使用换行及(\n或\r\n和br)的应用

    浏览器识别不了\n或\r\n,这两个换行符是文本换行符,文本文件有效;假设须要将结果输出到浏览器或打印到显示器,代码中使用br;假设仅仅是在源码中换行.则使用\n或\r\n,感兴趣的朋友能够了解下,也 ...

  4. 机器学习 文本分类 代码_无需担心机器学习-如何在少于10行代码中对文本进行分类

    机器学习 文本分类 代码 This article builds upon my previous two articles where I share some tips on how to get ...

  5. 如何在R代码中找到一个值的行号

    如何在R代码中找到一个值的行号? 例如: 在以下一组值中,如何在第4列中找到特定值的行号? 如何使用R代码命令找到列4中的值"1578"的行号. > mydata_2sex ...

  6. matlab创建符号常量出错,错误:代码中意外的符号/输入/字符串常量/数值常数/特殊...

    这些错误意味着您试图运行的R代码或源代码在语法上是不正确的.也就是说,你有一个错误. 若要修复此问题,请仔细阅读错误消息.错误消息中提供的代码显示了R认为问题所在的地方.在原始代码中找到这一行,并查找 ...

  7. 【转载】 C++中回车换行(\n\r)和换行(\r)的区别

    原文:http://blog.csdn.net/xiaofei2010/article/details/8458605 windows下的点一下回车,效果是:回车换行,就是\r\n unix系统下的回 ...

  8. 如何在android的XML和java代码中引用字符串常量

    使用字符串(string)资源        在一个Android工程中,我们可能会使用到大量的字符串作为提示信息.这些字符串都可以作为字符串资源声明在配置文件中,从而实现程序的可配置性. 在代码中我 ...

  9. c++hello world代码_在 Rust 代码中编写 Python 是种怎样的体验?

    作者 | Mara Bos,Rust资深工程师译者 | Arvin 责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews) 以下为译文: 大约一年前,我发布了一 ...

最新文章

  1. [模拟]纺车的轮子 Spinning Wheels
  2. 九种浏览器端缓存机制知多少(转)
  3. Word插入Latex公式的几种方式~(TeXsWord、EqualX、Aurora、向Office插入LaTeX公式的工具)
  4. 一种创建进程间COM来启动IE的方式
  5. boost::is_straight_line_drawing用法的测试程序
  6. 用boost库实现traceroute小工具
  7. 12对胸椎对应体表标志_铁路信号之信号表示器及标志(三)
  8. 【渝粤教育】电大中专电子商务网站建设与维护 (8)作业 题库
  9. 精通 WPF UI Virtualization
  10. 字节跳动和腾讯不正当竞争案将于深圳开庭 抖音:我们也是看新闻才知道本月24日要开庭...
  11. JS中的大括号{}和中括号[]详解
  12. 视频分享:挨踢项目求生法则(2)——战略篇
  13. java微信公众号支付示例
  14. JavaWeb中的问题 ---- Servlet和Jsp
  15. 【计算机组织与体系结构】实验二:给定指令系统的处理器设计
  16. 重温设计模式二 设计原则之依赖倒置原则
  17. linux踢人命令 pkill踢人用法
  18. SQl server 2008 r2 迅雷下载地址
  19. ODX介绍(2)[ DiagLayerStructure]
  20. vasp测试计算机,求助:无法判断vasp测试是否完成

热门文章

  1. HBase的基础知识
  2. [傅里叶变换及其应用学习笔记] 九. 继续卷积的讨论
  3. Android -- WebView进度条
  4. 前端开发中那些不招人“待见”的功能
  5. [C++]MySQL数据库操作实例
  6. 安全四部曲之一---***工具简单使用
  7. 来自专业的RIA咨询strechmedia机构提供的Flex组件
  8. mac电脑php中安装swoole扩展件
  9. Java中BufferedReader和InputStreamReader
  10. mysql注入5.0以上_[Injection]对MYSQL 5.0服务器以上版本注入