关于C语言中的换行符和回车符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言中的换行符和回车符相关的知识,希望对你有一定的参考价值。

把换行符和回车符用ASCII码表示,然后写了下面的小程序:但不理解为什么输出结果是这样,求大神指点。(如果是回车就没问题的,下面写的是换行符,是十六进制的转义字符)
#include<stdio.h>main() printf("%c",'a'); printf("%c",'\xd'); printf("%c",'b');
输出结果:d
为什么不是:a
d
再改一下:
#include<stdio.h>main() printf("%c",'a'); printf("%c",'c'); printf("%c",'\xd'); printf("%c",'b');
输出结果:bc
竟然b和c的顺序也是反的,实在不懂。。。

注意有两个比较特殊的字符
回车符和回车换行符
'\xd'这是个转义字符
其中的x表示他是一个16进制数
16进制的d就是10进制的13
也就是 '\r' 字符,也就是回车符(注意跟'\n'这个回车换行符比较)
输入这个字符后,光标会跳到本行首,注意是本行首位,好了
看你的代码
#include<stdio.h>
void main()

printf("%c",'a'); //先输入字符a
printf("%c",'\xd'); //跳到这行首
printf("%c",'b'); //再输出字符b,覆盖了最开始输出的a字符,所以最后只输出 字符b

第二段代码:
#include<stdio.h>
void main()

printf("%c",'a'); //先输出a
printf("%c",'c'); //再输出c
printf("%c",'\xd'); //跳到行首
printf("%c",'b'); //输出b,覆盖了第一句的a,所以输出 bc
参考技术A 文本文件的行结束符,传统上
PC机

CRLF
苹果机用CR
unix

LF
CR
--
回车符,c语言'\r'
LF
--
换行符,
c语言'\n'
不同计算机上c语言统一规定为:
文本文件的行结束符一律变成一个符号LF,也就是换行符,也就是new
line符,
也就是'\n'.
“回车和换行符转换成一个换行符”--
对PC机而言,文本文件行结束符,CRLF读入后,丢掉CR,留LF.
例如fgets()
读入一行,行尾只有LF,没有CR.
参考技术B 将printf("%c",'\xd');
改为
printf("%c",'\x0d');
结果还是一样吗
参考技术C printf("%c",'a'); 在本行第一格,打印字符a
printf("%c",'\xd'); 光标移动到本行第一格 因为 \xd 是16进制编码 0x0d, 是控制字符 “回车”。
printf("%c",'b'); 在当前位置上 打印字符b,这就把原来本行第一格处的字符改写了。
printf("%c",'a'); 在本行第一格,打印字符a
printf("%c",'c'); 在本行第二格,打印字符c
printf("%c",'\xd'); 光标移动到本行第一格
printf("%c",'b'); 在当前位置上 打印字符b,把原来本行第一格处的字符改写成b
第一格是b,第2格是c
看到是 bc

0x0a -- 新行,换行,New-Line, Line Feed (LF)
0x0d -- 回车,Carriage Return, (CR)

回车符和换行符之间的区别

回车符号和换行符号产生背景:    

关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

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

Unix系统里,每行结尾的行结束符只有“<换行>”,即:“ ”;Windows系统里面,每行结尾的行结束符是“ <回车><换行>”,即:“ ”;Mac系统里,每行结尾的行结束符是“<回车>”,即:“ ”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

具体区别:

区别一:不同系统对于换行符和回车符的解析

先生成一个换行( , 0x0A)和回车( , 0x0D)组合的文本

$ echo -en ‘12 34 56 78 ‘ > tmp

以十六进制方式查看文本

$ od -t x1 tmp
   0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a
   0000016
在Linux的vim中的显示效果:

技术图片

 

 

在windows的记事本中的显示效果

技术图片

 

 

可见Linux中遇到换行符会进行回车+换行的操作,回车符反而只会作为控制字符显示,不发生回车的操作。而windows中要回车符+换行符才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。

区别二:Enter键输入的行结束符是换行符还是回车符?

在网上有这样一种说法,是说在Windows中Enter键输入的是 ,而Unix系统中Enter键输入的是 ,Mac系统中Enter键输入的是 。

区别三:回车符和换行符在编程方面的区别?

编程相关:

文本文件的行结束符,传统上

Windows     用CRLF

苹果机      用CR

UNIX        用LF

CR -- 回车符,C语言‘ ‘

LF -- 换行符,C语言‘ ‘

     在不同计算机上C语言标准库将文本文件的行结束符一律变成一个符号LF,也就是换行符,也就是new line符,也就是‘ ‘。那么,对于Windows机而言——“回车和换行符转换成一个换行符”即:文本文件行结束符,CRLF读入后,丢掉CR,留LF。

例如:在Windows平台下,fgets()读入一行,行尾只会有LF,而没有CR。

     再不使用C语言标准库解析文本文件内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定" "又要判定" "或“ ”。此时得到一行,将其进行去掉" "或" "或“ ”,这样就能得到你所需要的字符串了。

‘ ‘ 0x0a 10 换行符(newline)

‘ ‘ 0x0d 13 回车符(return)

 

备注:如何将Linux系统中的windows格式的文件转化为unix格式呢?使用dos2unix命令即可
安装:yum install -y dos2unix

转换:dos2unix  文件名

 

以上是关于关于C语言中的换行符和回车符的主要内容,如果未能解决你的问题,请参考以下文章

关于换行符CR和LF的区别

C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)

C语言一次读取文件全部内容(注意:ftell()在windows上会把回车符计算在内,linux不会计算回车符,但相比windows,会自动补全最后一行的换行符)

在sql server 数据库字段中如何加入回车符和换行符?

如何替换SQL字段中的换行符,回车符

Delphi中JSON回车换行符转义