c语言中用两个n表示什么格式,C语言中‘\n'为什么能表示CRLF两个字节
为什么要说这个简单的问题?
众所周知,在Windows下文本文件的换行符是CRLF,占两个字节。在Unix下是LF,占一个字节。(还有奇葩的Mac是CR)。但是C语言中直接printf一个 ‘\n’,在Windows下就是CRLF两个字符,然后getchar读入,又成了’\n’这一个字符。这不是有点奇怪吗?大多脚本语言还有Java中,‘\n’就是LF一个字节,ASCII码是10。
先普及一个历史故事
计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。Unix 系统里,每行结尾只有“”,即“\n”;Windows系统里面,每行结尾是“”,即“ \r\n”;Mac系统里,每行结尾是“”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
C语言测试代码
在Windows下运行下面的代码:
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
freopen("123456.txt", "w", stdout);
char* str = "abc\n";
printf(str);
return ;
}
“123456.txt”这一文件中就会有5个字节:‘a’ ‘b’ ‘c’ ‘CR’ ‘LF’。
但是如果把代码改成这样:
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
freopen("123456.txt", "wb", stdout);
char* str = "abc\n";
printf(str);
return ;
}
就只有4个字节了:‘a’ ‘b’ ‘c’ ‘LF’。
原因往往都是最简单的
标准C语言的文本流提供系统无关抽象层。
总结来说就是上面一句话。\n 在文本模式下是逻辑新行符,读写时可根据平台和物理存储之间进行转换,我们平时用标准C的输入输出时完全不用关注这一点,但是如果我们绕过标准输入输出直接调用windows中coredll.lib进行控制台输入输出时就必须面对这一现实。
个人观点
标准问题往往都是无休止的争论,CRLF的争论也一直没有停止过。CRLF与历史更加统一,而LF更加简洁,并没有严格的孰优孰劣之分。
Python语言中enumerate()及zip()函数的使用例子
在Python编程语言中,enumerate()及zip()是两个常用的内置函数,这两个函数功能类似,但又有所区别,下面通过两个例子分别进行说明. enumerate()函数 该函数在字面上是枚举.列 ...
C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
C语言中do...while(0)的妙用(转载)
转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...
C语言中,定义的含义?声明的含义?它们之间的区别是什么?
在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...
C++中函数的默认参数和C语言中volatile的学习
1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...
C语言中qsort函数用法
C语言中qsort函数用法-示例分析 本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...
c语言中time相关函数
工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...
随机推荐
Ajax跨域问题的两种解决方法
浏览器不允许Ajax跨站请求,所以存在Ajax跨域问题,目前主要有两种办法解决. 1.在请求页面上使用Access-Control-Allow-Origin标头. 使用如下标头可以接受全部网站请求: ...
解决宿主机不能访问虚拟机CentOS中的站点 | 更新CentOS防火墙设置开启80端口访问
前阵子在虚拟机上装好了centos6.0,并配好了nginx+php+mysql,但是本机就是无法访问.一直就没去折腾了. 具体情况如下 1.本机能ping通虚拟机 2.虚拟机也能ping通本机 3. ...
defer 和 async 本地对象和宿主对象
没有defer和async的情况下是"同步执行"的,浏览器解析到这里的时候,会先加载资源完成后立即执行,并阻 ...
【C】——幻方算法
一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...
第五篇 SQL Server安全架构和安全
本篇文章是SQL Server安全系列的第五篇,详细内容请参考原文. 架构本质上是一个数据库对象,其他对象的一个容器,在复杂的数据库中它能够很容易的管理各组对象.架构具有重要的安全功能.在这一篇你会学 ...
Comparing cards
For built-in types, there are conditional operators (, ==, etc.) that compare values and d ...
HDU1437+模拟
枚举中间可能出现的天气 #include #include #include ; ][ ]; void s ...
SRM 396(1-250pt)
DIV1 250pt 题意:对于一个字符串s,若对于每一个i = 0 to s.size()-p-1都有s[i] = s[i+p]则称字符串s是p循环的."CATCATC", &q ...
Python偏函数实例
目标: 1.编写一个gui,生成按钮 2.通过偏函数,生成按钮 3.通过装饰器,实现按钮输出信息功能 1.使用Tkinter,创建一个按钮 代码如下: handetiandeMacBook-Pro:~ ...
BZOJ2882工艺
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
c语言中用两个n表示什么格式,C语言中‘\n'为什么能表示CRLF两个字节相关推荐
- 在c语言中 一个函数一般由两个部分组成的,在C语言中,一个函数一般由两个部分组成,它们是______和______。...
在C语言中,一个函数一般由两个部分组成,它们是______和______. 更多相关问题 [判断题]铁能从硫酸铜溶液中取代出铜,是因为铁与硫酸根具有更大的亲和力. A. 对 B. 错 [多选题]进行关 ...
- c语言中保存字符串实质上是,在C语言中,保存字符串“B”实质上是保存字符B和\0两个符号。...
在C语言中,保存字符串"B"实质上是保存字符B和\0两个符号. 中字符字符下列哪个选项不属于授权的事项?() 保存保存四大()之首卢浮宫是人类最伟大的一个建筑. 实质上1889年庆 ...
- c语言中什么函数可以作为虚函数,C++语言中的“虚函数”就像C语言中的指针,必须要弄懂的...
上一节较为详细的讨论了C++语言中基类被派生类继承过程中的内存模型,尤其较为详细的分析了虚函数及其虚表.虚表指针在内存中是如何分布,如何存储的,这对于理解C++语言中的"动态绑定" ...
- c语言include的用法 相对目录 绝对目录,c语言中include的用法
<c语言中include的用法>由会员分享,可在线阅读,更多相关<c语言中include的用法(3页珍藏版)>请在人人文库网上搜索. 1.c语言中in elude 的用法c语言 ...
- c语言switch语句支持的字符有哪些,C语言中switch()语句的括号内可以是什么型别的呢?...
C语言中switch()语句的括号内可以是什么型别的呢?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中swit ...
- c语言4钟存储类型关键字用法,求C语言中的32个关键字及其意思? C语言中32个关键字的意思和用法~!...
C语言中的32个关键字及其意思如下: 1.auto 声明自动变量 2.short 声明短整型变量或函数 3.int 声明整型变量或函数 4.long 声明长整型变量或函数 5. ...
- 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...
[简答题]需求分析完整话术 [简答题] [单选题]适用于场地面积有限,集装箱吞吐量较大的水陆联运码头的起重机系统是( )系统 [单选题]利用叉车或半挂车.汽车承载货物,连同车辆一起开上开下船,到达目的 ...
- 关于python语言中缩进的说法_以下关于Python语言中“缩进”说法正确的是:
[多选题]From the perspective of the production enterprise (the content is more extensive), any differen ...
- c语言switch语句最大嵌套数,浅谈C语言中switch 语句的嵌套使用
浅谈C语言中switch 语句的嵌套使用 作者:未知 [摘要]switch语句是一种分支控制语句,它的应用在程序设计中起至了很重要的作用.由于其格式复杂,对于初学者来说很难掌握,switch语句的嵌套 ...
最新文章
- windows10安装docker
- 人脸检测--Grid Loss: Detecting Occluded Faces
- linux查看服务器设备信息命令dmidecode
- JVM内存区域:常用指令集
- Python编程专属骚技巧9
- php redis 扩展 编译安装,Linux 下 PHP 扩展 redis 编译安装
- 小程序点击地图气泡获取气泡_气泡上的气泡
- java线程提高速度_如何在JAVA中减慢线程速度
- SpringBoot2整合Activiti6工作流框架 源码
- java垃圾回收机制标记_Java的垃圾回收机制-垃圾收集算法(一)
- 1011. World Cup Betting (20)——PAT (Advanced Level) Practise
- Windows环境下log4cxx的编译及使用(转载)
- 南阳oj-----D的小L(algorithm全排列用法)
- Dynamic Rankings(整体二分)
- QT递归获取指定目录下的所有文件
- vi/vim编辑器常用命令
- 将字符串中的英文大写字母换成小写字母-c语言实现
- [技术分享 – FCS 篇] 驭龙五式3之飞龙在天:安装 FCS 服务器
- 新操作系统有哪些新功能?一起来看看吧!
- 器件选型电源篇-DC/DC器件选型