LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: float

为什么C程序源文件末尾一定要留一空行

[复制链接]
 楼主| 发表于 2003-10-24 22:12:10 | 显示全部楼层
那么回车和换行符有什么区别呢?
发表于 2003-10-24 22:17:29 | 显示全部楼层
这使我想起很久以前接触到的一个问题。

windows98的注册表被攻击者锁住后,可以编一个小程序来打开注册表,输入完代码后必须回车从而产生空行,否则不能打开注册表,程序代码早已忘记,不清楚是不是用C语言,当时有人说这是c的标准。
发表于 2003-10-24 22:36:32 | 显示全部楼层
最初由 libinary 发表
不是空行,而是最后一个字符应该是回车

呵呵,说错了,应该是换行符(\n)
发表于 2003-10-24 23:36:09 | 显示全部楼层
是回车的问题,/r/...什么的,记不住了。
一定要有回车的。
发表于 2003-10-24 23:59:45 | 显示全部楼层
*nix 用 0x0a  ?肀硎緍eturn/enter
dos 用 0x0d 0x0a ?肀硎
return = 回車
enter = 空行
return = enter
只是系統不同而有分別罷了
发表于 2003-10-25 08:53:01 | 显示全部楼层
在linux下编辑的文件没有这个问题,比如用vim xxx.c编辑一个文件,最后一行只有一个右大括弧(}),编译的时候就没问题,用od -c xxx.c看一下,发现右大括弧后面还有一个换行符(\n),这里就没有结尾的空行,所以主要是要有换行符,我估计这里主要是和程序的读取方式有关,没有换行符就不是完整的行,某些程序处理的时候可能有问题,比如用某些工具处理xxx.c的时候可能就不对,最简单的就是cat xxx.c yyy.c,这里xxx.c的最后一行和yyy.c的第一行连到一起了
 楼主| 发表于 2003-10-25 09:25:12 | 显示全部楼层
呵呵,谢谢,没想到问一个小小的问题让我学到了这么多的东西。
发表于 2003-10-25 09:32:48 | 显示全部楼层
关于回车符和换行符,如果你用过机械打字机就能比较明白了,打字机上面有一个可以动的小车,小车上有卷纸的滚筒,每打一个字符,小车就移动一个字符的距离,等打完一行以后,用手推小车到原始位置(一行的开头),这个叫回车,转动滚筒,把打字的位置换到下一行,这个叫换行,实际上小车上有一个把手,每次打完一行直接推这个把手就会产生连续动作,先回车后换行,所以计算机里的字符序列也是\r\n。

计算机里\r就是把输出光标移到本行的开头,\n就是下移一行(列位置还和当前的一样),所以应该是\r\n才能移到下一行的开头,不过一般的库函数都自动处理这种情况了,printf("cc\n");库函数直接把\n替换成了\r\n序列,在dos/windows下用cprintf之类的函数就可以看到没有替换的效果(开头的c的意思是con,c打头的函数有好几个,包含在<conio.h>里,最好是borland或MS的编译器,我用Dev-C++试过,不行),在UNIX系统里系统直接处理\n,所以写程序比较简单,不需要我们考虑什么转换,不象dos/win里,文件保存的都是\r\n,用库函数读进来全是\n,要是不用库函数,我们自己还要做转换,不管是转换还是对结果大小的判断都比较麻烦。
 楼主| 发表于 2003-10-25 10:35:37 | 显示全部楼层
libinary版主真是见多识广啊。
发表于 2003-10-25 10:47:47 | 显示全部楼层

悟了!

这说明在unix里,文本文件的本质不是内容都是字符,而是:
它是以由换行结尾的行组成的文件
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表