您的位置:永利集团登录网址 > 永利集团登录网址 > windows下的c语言和linux 下的c语言以及C标准库和系

windows下的c语言和linux 下的c语言以及C标准库和系

2019-11-15 03:46

 n   为ASCII的0x0a   换行
        r   为ASCII的0x0d   回车

windows下的c语言和linux 下的c语言以及C标准库和系统API

换行符在Linux和Windows下的区别

        在windows   系统中,当你输入回车时会自动变成rn
        在linux下的回车键只代表n
        而在windows下的回车键表示rn
        n为进入下一行,r为打印头回到行首上
        linux/unix下只用n,它就表示回车+换行
        而windows下,r只回车不换行的,n是换行,但在有些编辑中,单独的n是不会换行的(如notepad)

1.引出我们的问题?

 

        一般在程序中,写n就可以了,它在linux或windows中都能实现回车+换行的功能(只是在文本文件中,linux只会有0x0a,windows会自动换为0x0d   0x0a)
下面举个例子: www.2cto.com

标准c库都是一样的!大家想必都在windows下做过文件编程,在linux下也是一样的函数名,参数都一样。当时就有了疑问,因为我们非常清楚

一、区别

#include<stdio.h> 
int main() 

    char a[10]="abcr"; 
    printf(a); 
    return 0; 

程序运行时没有任何输出。
原因就是 r 回车 表示打印头回到该行起始位置,从而覆盖了abc,所以控制台上就没有任何输出啦!

其本质是不可能一样的,源于这是俩个操作系统啊!但由于c标准库的封装就实现了接口一样。但是如果往深入,我们就非常清楚了在这层封装上还有一层封装其实就是操作系统对文件操作的封装,也就是文件IO。而我们c语言的封装叫标准IO,他们有什么区别那?显然标准iO是基于文件io的,标准IO调用了文件IO,也优化了文件IO,例如引入缓存机制。

换行符:  www.2cto.com  

摘自 姜亚风CSDN博客

2.上面我说的就是下面的几个点

1.windows中的换行符是rn,

为ASCII的0x0a 换行 r 为ASCII的0x0d 回车 在windows 系统中,当你输入回车时会自动变成rn 在linux下的回车键只代表n 而在windows下的回车键表示...

但如果涉及到系统调用那就不同了!

  1. linux/unix下的换行符是n。

不同的系统提供的系统调用是不同的,有的调用可能相同(接口),但是内部实现不同!

其中:

如果没有涉及系统独有的库函数或者编程方法(即只用符合ANSI C标准的代码和方法)就没有区别 (标准库,标准IO)

回车符:r=0x0d (13) return; #回车(carriage return)

如果涉及到系统编程,二者有所区别,主要是库函数有所不同,而且文件系统不同、对某些函数的执行方式不同。(文件IO,操作系统API)

换行符:n=0x0a (10) newline。#换行(newline)

3.具体的一些区别

   www.2cto.com  

n 为ASCII的0x0a 换行

二、文件格式互转命令

r 为ASCII的0x0d 回车

1.unix2dos:将具有unix风格的格式文件转化为具有window下的格式文件。

在windows 系统中,当你输入回车时会自动变成rn

2.dos2unix:将具有windows风格的格式文件转化为unix下的格式文件。

在linux下的回车键只代表n

 

而在windows下的回车键表示rn

Reply-text mb10代码  

n为进入下一行,r为打印头回到行首上

<span style="">windows的换行符是rn Linux采用的是n  

linux/unix下只用n,它就表示回车+换行

可以采用unix2dos或dos2unix转换文本文件 </span>  

而windows下,r只回车不换行的,n是换行,但在有些编辑中,单独的n是不会换行的(如notepad)

 

一般在程序中,写n就可以了,它在linux或windows中都能实现回车+换行的功能(只是在文本文件中,linux只会有0x0a,windows会自动换为0x0d 0x0a)

三、回车换行符的历史背景

下面举个例子:

早期的计算机输出设备不是显示器,而是电传打字机,结构与普通的打字机差不多。有一个打印头在纸上打字,同时有一个电动机控制纸张的进出。当打印头到达行尾的时候,需要两个动作才能够到达下一行的行首:首先执行回车动作,将打印头移动到本行的行首,然后进行换行动作,电动机将纸张向上移动一行,这样打印头就处于下一行的行首,可以继续进行打印。回车和换行对应的控制字符分别是r和n,这就是windows中换行符为rn的由来。后来由于经常连续执行,所以在打印机中将这两个控制字符简化为一个控制字符,这就是linux/unix中的换行符n的由来。

#include int main() { char a[10]="abcr"; printf(a); return 0; }

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

程序运行时没有任何输出。

 

原因就是 r 回车 表示打印头回到该行起始位置,从而覆盖了abc,所以控制台上就没有任何输出啦!

四、引起的现象和问题:

函数库的区别

 

linux下的C函数库和windows下的函数库系统调用的机制不一样

1.问题一

Glibc包含了主要的C库。这个库提供了基本例程,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等等。所说的机制不一样不单是指中断号的问题,中断号也是通过input参数和output把函数地址和输出地址定位在寄存器的,那些函数在windows和linux下的实现应该是不一样的,就拿文件系统来说,ext3和fat32的怎么可能一样.还有mm内存管理,都是不一样的.中断还是属于硬件层的,X86上的应该都差不多,但操作系统层的实现就大不相同了.

​ 做一个日志文件的时候发现由printWriter写出来的文件在windows上打开 是混乱的,因为在linux下执行printLn方法时 写入的换行符是n ,在windows没法识别rn才能被认为是换行

4.其他区别:

 

1。系统平台不一样

  1. 问题二 

底层开发就涉及到了系统内核的问题,对于linux来说,你可以知道它里面是什么结构,而windows。。。

有时在WIN下编辑好的脚本文件上传到LINUX服务器中不能正常执行,开始误认为是LINUX配置问题,后来发现,是WIN与LINUX存储文件时的换行符标志不同造成的。在DOS使用的换行符为 ^M$,我们称为CR与LF两个符号。而在Linux中,则仅有LF ($) 这个换行符。

2。编译器环境不一样

  可以用如下命令完成格式转换:$dos2unix,$unix2dos。但这两个命令在Ubuntu发行版本中不存在,可通过:

linux采用gcc编译器,gdb调试工具,和多种可视化的编辑器如   emacs,kedit等等,也有文本的vi/vim,GDB的功能是非常强大的,个人认为较win下的好

  $sudo apt-get install tofrodos

尽管win下地mingw,devcpp集成了gcc,但是搞的总让人不爽~,gcc对标准的支持是相当的好

  命令安装。之后,再次使用如下文所示的格式即可。

3。针对人群不一样

  [[email protected] ~]# dos2unix [-kn] file [newfile]

win下主要还是面向商业化的开发,而绝大多数的编程爱好者则喜欢属于自己开阔自由的系统下编程,不愿意禁锢在windows下(MS)的包围中

  [[email protected] ~]# unix2dos [-kn] file [newfile]

4。发展方向不一样。

  参数:

OpenSource的思想已经在linux这片净土开花,参见GPL....。找资料方便,源代码公开,可以体验开发的乐趣

  -k : 保留该文件原来的mtime时间格式(不更新文件上次内容经过修改的时间)

win下,ms逐步把一批开发人员束缚在它自己的系统里面,开发环境越来越傻瓜,这能不能叫人性化呢?搞到最后。。。可能越走越远~

  -n : 保留原来的旧文件,将转换后的内容输出到新文件,如:dos2unix -n old new

5.版权问题

  范例:

win下的好多好多东西都涉及到版权问题,linux的free软件虽然是开放软件,不过好多好多都是免费用于商业化的。。。当然有的需要开发源代码,好多也不需要~

  范例一:将提供的hosts文件格式更新为dos格式。

C++的区别也差不多

  [[email protected]windows下的c语言和linux 下的c语言以及C标准库和系统API。 ~]# unix2dos -k hosts

从程序完成的功能来看,函数库提供的函数通常是不需要操作系统的服务,函数是在用户空间内执行的,除非函数涉及到I/O操作等,一般是不会切到核心态的。系统调用是要求操作系统为用户提供进程,提供某种服务,通常是涉及系统的硬件资源和一些敏感的软件资源等。

  unix2dos: converting file hosts to DOS format ...

函数库的函数,尤其与输入输出相关的函数,大多必须通过linux的系统调用来完成。因此我们可以将函数库的函数当成应用程序设计人员与系统调用程序之间的一个中间层,通过这个中间层,我们可以用一致的接口来安全的调用系统调用。这样程序员可以只要写一次代码就能够在不同版本的linux系统间使用积压种具体实现完全不同的系统调用。至于如何实现对不同的系统调用的兼容性问题,那是函数库开发者所关心的问题。

  # 此时hosts文件的时间不会改变,但内容主要将换行符修改成为DOS的CRLF了。

从程序执行效率来看,系统调用的执行效率大多要比函数高,尤其是处理输入输出的函数。当处理的数据量比较小时,函数库的函数执行效率可能比较好,因为函数库的作法是将要处理的数据先存入缓冲区内,等到缓冲区装满了,再将数据一次写入或者读出。这种方式处理小量数据时效率比较高,但是在进行系统调用时,因为用户进程从用户模式进入系统核心模式,中间涉及了许多额外的任务的切换工作,这些操作称为上下文切换,此类的额外工作会影响系统的执行效率。但是当要处理的数据量比较大时,例如当输入输出的数据量超过文件系统定义的尽寸时,利用系统调用可获得较高的效率。

  范例二:将范例一已经变成DOS格式的hosts改名为hosts.dos,并且转换Linux

从程序的可移植性的角度来看,相对于系统调用,C语言的标准备函数库(ANSI C) 具备较高的可移植性,在不同的系统环境下,只要做很少的修改,通常情况是不需要修改的。

  格式到hosts.linux

Linux C中库函数和系统调用的区别

  [[email protected] ~]# mv hosts hosts.dos

库函数是高层的,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用 write()输出这些字符串。

  [[email protected] ~]# dos2unix -k -n hosts.dos hosts.linux

是否想看一看printf()究竟使用了哪些系统调用? 这很容易,编译下面的代码。

  dos2unix: converting file hosts.dos to file hosts.linux in UNIX format ...

复制代码 代码如下:

  [[email protected] ~]# ll

#include

  -rw-r--r-- 1 root root 288 Aug 1 13:30 hosts.dos

int main(void)

  -rw------- 1 root root 279 Aug 1 13:30 hosts.linux

{ printf("hello"); return 0; }

  # 由于DOS格式中多了CR字符,所以,文件比较大。

使用命令gcc -Wall -o hello hello.c编译。用命令 strace hello 跟踪该可执行文件。是否很惊讶? 每一行都和一个系统调用相对应。 strace是一个非常有用的程序,它可以告诉你程序使用了哪些系统调用和这些系统调用的参数,返回值。 这是一个极有价值的查看程序在干什么的工具。在输出的末尾,你应该看到这样类似的一行 write(1, "hello", 5hello)。这就是我们要找的。藏在面具printf() 的真实面目。既然绝大多数人使用库函数来对文件I/O进行操作(像 fopen, fputs, fclose)。 你可以查看man说明的第二部分使用命令man 2 write 。man说明的第二部分专门介绍系统调用(像kill()和read())。 man说明的第三部分则专门介绍你可能更熟悉的库函数(像cosh()和random())。

 

你甚至可以编写代码去覆盖系统调用,正如我们不久要做的。骇客常这样做来为系统安装后门或木马。 但你可以用它来完成一些更有益的事,像让内核在每次某人删除文件时输出 “ Tee hee, that tickles!” 的信息。

  1. 现象三

——张飞online 2016年10月14日23:06:45

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

$ echo -en '12n34r56nr78rn' > tmp

以十六进制方式查看文本

$ od -t x1 tmp

0000000 31 32 0a 33 34 0d 35 36 0a 0d 37 38 0d 0a

0000016

 

五、编程相关

 

文本文件的行结束符,传统上 PC机 用 CRLF,苹果机用CR,unix 用 LF。【CR -- 回车符,c语言'r'】。【LF -- 换行符, c语言'n'】。

不同计算机上c语言统一规定为::文本文件的行结束符一律变成一个符号LF,也就是换行符,也就是new line符, 也就是'n'. “回车和换行符转换成一个换行符”

-- 对PC机而言,文本文件行结束符,CRLF读入后,丢掉CR,留 LF. 例如fgets() 读入一行,行尾只有LF,没有CR.

在解析文本或其他格式的文件内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定"rn"又要判定"n"。写程序时可能得到一行,将其进行trim掉'r',这样能得到你所需要的string了。

'n' 10 换行(newline)

'r' 13 回车(return)

 

最后:

ctrl+M: ^M 也称回车键

 

一、区别 换行符: www.2cto.com 1.windows中的换行符是rn, 2. linux/unix下的换行符是n。 其中: 回车符:r=0x0d (...

本文由永利集团登录网址发布于永利集团登录网址,转载请注明出处:windows下的c语言和linux 下的c语言以及C标准库和系

关键词:

  • 上一篇:没有了
  • 下一篇:没有了