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

原创 2013年12月01日 21:25:32

一.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,连续输入两次就行了。

 


版权声明:欢迎转载

相关文章推荐

字符串结束符'\0'

http://blog.csdn.net/yeyuangen/article/details/6792683 '\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么...
  • HEN_MAN
  • HEN_MAN
  • 2011年10月16日 21:21
  • 33464

字符串结束符'\0' -何时自动加- 字符串定义方法

转载▼ 字符串定义方法 有两种方法: 1)        用字符数组; 2)        用字符指针; 对应两种定义方法,有不同的初始化以及赋值方法 ...

java与C语言在字符串结束符上的区别

综述:在C语言中字符串或字符数组最后都会有一个额外的字符‘\0’来表示结束,而在java语言中没有结束符这一概念。具体见下面分析。 1. C 语言   在C语言中字符串和字符数组基本上没有区别,都需要...

C/C++__字符串的结束符“\0”到底是什么

一直对字符串的结束符"\0"的具体意义感到困惑,今天实际测试了一下,最终我找出来了答案。 #include #include #pragma warning(disable:4996) #...

EOF \n \0 NULL 之间的区别

第一个问题是EOF  它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。 比如,下面这段代码就表...

NULL, NUL, EOF, '/0'区别

NULL: 定义为0或0L或(void *)0,用于指示一个指针值是空,即什么都不指;'/0': 用且只用字符串结束符;NUL : 0x00,0值字符,可以用于结束ASCII字符串,和'/0'类似,但...

关于EOF和NULL

转自:http://blog.chinaunix.net/uid-24856020-id-2559036.html1、关于EOF End Of File,在计算机术语缩写通常为 EOF。 ...

linux TXT文件操作 '^@ ' 'NUL' 符号乱码问题

linux文件编程TXT文档在windows下打开有乱码问题(显示非显示字符)

当字符数组中没有结束符'\0'

当字符数组中没有结束符'\0'的时候,结果未知。 代码: #include #include using namespace std; void print(char a[]){ ...

【面试经典题之字符串】用C或C++写一个函数,实现反转一个null结尾的字符串

用C或C++实现void reverse(char* str)函数,即反转一个null结尾的字符串。 解题: 首先我们要知道字符串都是以NULL结尾的。使用一个char型end指针,找到NULL的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C笔记之NULL和字符串结束符'\0'和EOF
举报原因:
原因补充:

(最多只允许输入30个字)