!!! c语言0,'\0',EOF,NULL的区别
? C语言 ?    2017-09-02 01:19:34    540    0    0
simon88   ? C语言 ?

C笔记之NULL和字符串结束符'\0'和EOF

一.NULL

NULL是一个宏,它在几个标准头文件中定义,0是一个整型常量,'\0'是一个字符常量,而NUL是一个字符常量的名字。这几个术语都不可互换。

1、NULL用于表示什么也不指向,也就是空指针((void *)0)

2、0可以被用于任何地方,它是表示各种类型零值的符号并且编译器会挑出它

3、'\0'应该只被用于结束字符串

4、NULL没有被定义于C和C++,它不应该被使用除非你自己定义它,像:#define NULL  '\0'。  

很多编译系统中的实现是:#define NULL (void*)0


二. 字符串结束符'\0'

1.  字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'。 例如char  c[5]={'a','b','c','d','e'};也是合法的,但是用printf("%s",c),输出数组时会出错。 "%s"格式符对字符串输出时,遇结束符'\0'就停止输出。 而在前面这个字符数组中并没有结束符'\0',所以输完abcde还会继续输出一些未知的东西。 这种情况是能用"%c"输出格式循环输出每个字符。


2.  系统对字符串常量自动加一个'\0',例如: char  str[ ]="liao";和 char * string="liao";   则 sizeof(string)=5,输出到控制台为liao
3.  对于没有指定长度的字符数组,例如char str[ ]={'a','b','c','d','e'},系统不会在最后自动添加结束符'\0', 如果puts(str); 将会输出和abcde和一些未知的东西。 
4.  对于指定了长度的字符数组(初始化字符个数小于字符数组长度),例如char  string[4]={'a','b','c'}; 系统会在最后自动添加结束符'\0'


5. 如果用赋值语句"="对字符数组进行初始化,则只能在定义字符数组的同时进行,不能分成两步进行。 例如: char str1[5]={'a','b','c','d'}; 、 char str1[5]={"liao"};和char str1[5]="liao";是可以的,但是char str1[5];   str1={'a','b','c','d'};  和 char str1[5];  str1="liao";是不可以的。

三. EOF

 

EOF它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。

比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。

  char c;
  while ((c = fgetc(fp)) !=EOF) {
    putchar (c);
}​ 

但是EOF并不是一个特殊字符,而是一个定义在头文件stdio.h中的常量,一般定义为-1。#define  EOF -1  除了表示文件的结尾,EOF还可以表示标准输入的结尾。

char  c;
while((c=getchar())!=EOF){
     putchar();​

}  但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D);Windows中,Ctrl-Z表示EOF。(顺便提一句,Linux中按下Ctrl-Z,表示将该进程中断,在后台挂起,用fg命令可以重新切回到前台;按下Ctrl-C表示终止该进程。)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按"字面含义"解读下一个输入,要是想按"字面含义"输入Ctrl-V,连续输入两次就行了。

 

上一篇: linux vt码

下一篇: 头文件

540 人读过
0 条评论