【第22期】观点:IT 行业加班,到底有没有价值?

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,因为字符类型中并没有对应的这个字符,所以这么...

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

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

学习笔记------关于字符串结束符'\0'、字符串定义方法

字符串定义方法 有2种方法: 1)字符数组 2)字符指针 初始化 1)字符数组方式初始化大致3种: (1)   char str[10]="12345"或者char str[10]={'1','2...

C语言中字符串结束符'\0'的讨论

'\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。在数值类型里就代表数字0。 数值类型存储时,最高位决定正负号,其他位都为0可不就是0了么? '\0'是转译字符,...

C语言字符串结束符

C语言对字符串做了最奇怪的事:在每个字符串的末端加上了一个零。字符串末端的零有几种名字。下面列出了一些:Null零二进制零字符串结束符ASCII零/0警告 你唯独不能把字符串末端的零叫做零(zero)...

C 字符数组与字符串的使用及加结束符'\0'的问题

1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p',...

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

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

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

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

字符拷贝时字符串结束符'\0'很重要

近期由于memcpy字符串的时候,没有将结束符拷贝进去,导致字符串结尾有乱码,如图: std::ostringstream osg; osg.str(""); osg "; str...

C 字符数组与字符串的使用及加结束符'\0'的问题

1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ 'I',' ','a','m',' ',‘h','a','p','p',...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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