c语言表示字符为空的结尾,c语言0,'\0',EOF,NULL的区别

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

### C语言字符的概念 在C语言中,**字符Null Character)** 是一种特殊的字符常量,其值为 `'\0'` 或 ASCII 值为 0字符。它通常被用来标记字符串的结束位置,在内存中作为字符串终止符存在[^1]。 #### 字符的定义 字符并不是可见字符,而是一个不可见的控制字符。它的主要功能是在字符串处理过程中充当边界标志。当程序遇到 `'\0'` 时,会认为这是字符串的终点。因此,任何有效的C语言字符串都必须以 `\0` 结束[^2]。 ```c char str[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 上述数组str实际上就是一个合法的C语言字符串 ``` #### 字符的使用场景 1. **字符串终结符** 在C语言中,所有的字符串本质上是以字符数组的形式存储,并且总是以字符 `'\0'` 来标识字符串的结束位置。这使得函数能够通过检测到第一个 `'\0'` 来判断字符串的实际长度。 ```c char message[] = "Hello, world!"; printf("%s", message); // 输出直到遇到 '\0' ``` 2. **动态字符串拼接或修改** 当需要手动构建或者修改字符串时,确保最后加上 `'\0'` 才能形成完整的字符串对象。如果忘记设置该终止符,则可能导致未定义行为,比如越界访问等问题。 3. **字符串比较与查找算法** 很多标准库函数依赖于这个特性来执行各种操作,例如 `strlen()` 计算的是从起始地址开始至首个出现的 `'\0'`之间的距离;又如 `strcmp()` 则逐字节对比直至两者均抵达各自的零结尾为止才停止运算并返回结果状态码。 4. **文件读取过程中的应用** 对于某些涉及大量文本数据输入/输出的应用场合下,也可能利用这种机制实现更高效的缓冲区管理策略——即每当填充好一块固定大小区域之后便附加上相应的 NULL 终结子以便后续进一步解析调用方便快捷。 ```c #include <stdio.h> int main() { FILE *file; file = fopen("example.txt", "r"); if (file != NULL){ int ch; while ((ch = fgetc(file)) != EOF) { putchar(ch); } fclose(file); } else{ perror("Error opening file"); } return 0; } // 此处虽然没有显式写出 "\0" ,但在实际运行环境中每次写入都会自动补充上去 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值