from: https://blog.csdn.net/bairenxinmo/article/details/17662983

空字符'\0'

空字符即NUL字节,是一个ASCII值为0的控制字符,在程序代码中通常以转义序列'\0'表示,在C语言中,空字符非常重要,主要体现在字符串中。

字符串

字符串就是一串零个或多个字符,并且以bit模式为全0的NUL字节即空字符('\0')结尾。C语言中字符串没有显示的数据类型,字符串通常存储在字符数组或动态分配的内存中,在编码操作中通常将整个字符串作为操作对象,常用操作包括复制、查找、比较等。

空字符与字符串

1、空字符是字符串的终止符。注:空字符本身不是字符串的一部分,所以字符串的长度并不包含空字符;

2、操作字符串时,必须保证字符串以空字符结尾(注:不以空字符结尾的字符序列,不是字符串)。

如果在一个需要字符串的地方(例如strlen函数的参数)使用了一个不是以空字符结尾的字符序列,会造成什么结果呢?

a、strlen函数将无法知道空字符是没有的,所以它将继续进行查找,一个接一个字符查找直到发现一个空字符为止,或许它找几百个字符才找到,而此时strlen函数的这个返回值从本质上说是一个随机数或者说并没有实际意义;

b、如果字符串操作函数试图访问了系统分配给这个程序以外的内存范围,程序会崩溃(通常表现为段溢出,程序异常退出)。

潜在不以空字符结尾的字符序列操作总结:

a、char *strcpy(char *dst, char const *src) 假如源字符串src比目标字符数组dst长,多余的字符仍将被复制,它们将覆盖原先存储于目标字符数组dst后面的内存空间的值(程序存在崩溃可能也会影响其他存储值),最后目标字符数组dst显然是不以空字符结尾的字符序列,所以必须保证目标字符数组dst的空间能足以容纳源字符串src;

b、char *strncpy(char *dst, chat const *src, size_t len)  同上,首先必须保证目标字符数组dst的空间能足以容纳len个字符,除此之外,如果strlen(src)的值大于或等于len,那么只有len个字符被复制到dst中,但dst最终将不会以空字符结尾 -- 最好手动补\0

c、char *strcat(char *dst, char const *src)  假如源字符串src比目标字符数组dst剩余的空间长,多余的字符仍将被复制,它们将覆盖原先存储于目标字符数组dst后面的内存空间的值(程序存在崩溃可能也会影响其他存储值),最后目标字符数组dst显然是不以空字符结尾的字符序列,所以必须保证目标字符数组dst剩余的空间能足以容纳源字符串src;

d、char *strncat(char *dst, char const *src, size_t len) 同上,首先必须保证目标字符数组dst剩余的空间足以容纳len个字符,除此之外,如果strlen(src)的值大于或等于len,那么会有len个字符被复制到dst结尾处,但假如dst原有剩余空间刚好可以容纳len个字符,dst最终将不会以空字符结尾;

e、int strcmp(char const *s1, char const *s2)  strcmp函数的参数必须都以一个空字符结尾,如果并非如此,strcmp就可能对参数后面的字节进行比较,这个比较结果将不会有实际意义,同理strncmp也一样。

测试代码:

#include <stdio.h>
#include <string.h>int main()
{int len;char str[5];strcpy(str, "12345678");                   /*字符串拷贝*/len =strlen(str);                          /*字符串长度*/printf("str_len:%d\n", strlen(str));       /*打印目标字符串长度*/printf("str:%s\n", str);                   /*打印目标字符串*/  return 0;
}

测试结果:

测试分析:

测试代码中,函数strcpy将大于目标字符数组str存储空间长度的字符串拷贝给str(实际操作中会对其他存储值进行覆盖,危险操作,在作者的测试环境中未引发程序崩溃不代表在实际的开发环境中不会引起程序崩溃),目标字符串str最多存储5个字符,字符打印时结果为str:12345也证明如此,但字符串长度却实际输出为6,长度6根本没有实际意义,在其他测试环境中可能为大于5的任意值(如7、8等)。

空字符'\0'与字符串相关推荐

  1. 【C基础】空字符'\0'与字符串

    空字符'\0' 空字符即NUL字节,是一个ASCII值为0的控制字符,在程序代码中通常以转义序列'\0'表示,在C语言中,空字符非常重要,主要体现在字符串中. 字符串 字符串就是一串零个或多个字符,并 ...

  2. C语言中的空字符'\0'

    C语言中的空字符'\0' 本博客整理自: http://blog.csdn.net/suluner/article/details/54408638 https://zhidao.baidu.com/ ...

  3. DataFormatString={0:格式字符串} 用法

    具体用法: DataFormatString="{0:格式字符串}" 在DataFormatString 中的 {0} 表示数据本身,而在冒号后面的格式字符串代表所们希望数据显示的 ...

  4. 去掉字符串后面所有的0 去掉字符串前面或后面的0;

    https://blog.csdn.net/weixin_43844810/article/details/94577879 去掉字符串前面或后面的0: 养猫还是养狗? 2019-07-03 17:1 ...

  5. php: 0跟字符串做比较永远是true。 php大bug。

    php: 0跟字符串做比较永远是true. php大bug. 如: $a = 0; if( $a == 'excel') { echo "yes"; }else{ echo &qu ...

  6. 问题 G(1203): 【基础算法】0/1字符串问题

    问题 G(1203): [基础算法]0/1字符串问题 时间限制: 5 Sec 内存限制: 64 MB 提交: 127 解决: 25 [提交][状态][我的提交] 题目描述 输出仅由0和1组成的长度为N ...

  7. python 使用字节流bytes格式读取文件转为int格式,再转为0,1字符串格式

    python 使用字节流bytes格式读取文件转为int格式,再转为0,1字符串格式 with open('test.jpg', 'rb') as src:t = src.read(1) # 读进1B ...

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

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

  9. 关于字符串结束符'\0'、字符串定义方法

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

最新文章

  1. 深入剖析防火墙策略的执行过程
  2. 【 Linux 】Vim 使用的第一个阶段(满足基本的写代码需求)
  3. Java处理excel根据某列的值查询,并将结果显示在其他列中
  4. python入门代码示例-Python入门100个实例(14)——换行符和制表符
  5. 活动结束|金融圈第19期分享:数据系统如何防范金融非统性风险?
  6. 红帽子linux安装ftp,Linux 安装 vsftpd ftp软件包
  7. 数据结构与算法2——数组
  8. Transaction rolled back because it has been marked as rollback-only 异常处理
  9. mysql gis 时间_MySQL interval()函数
  10. 双目密集匹配的一般过程
  11. java打印unicode_java程序实现Unicode码和中文互相转换
  12. Ubuntu 1804 桌面版 Eclipse + JSP 学习记录
  13. 努力就一定会成功,这或许是一个问题?
  14. python 对任意文件(jpg,png,mp3,mp4)base64的编码解码
  15. 9008刷机工具_黔隆科技刷机教程OPPOR11忘记密码免刷机保资料解屏幕锁教程
  16. 知识图谱构建技术综述
  17. js设计模式之策略模式
  18. pandas数据处理操作大全
  19. Python科学计算-Numpy和Pandas学习笔记(一)-安装、Numpy属性和常用方法(chaochao`s Blog)
  20. linux 怎么烧录光盘,Linux下的光盘烧录工具brasero

热门文章

  1. parametric bootstrap参数估计抽样方法的R实现
  2. 单目图像深度估计 - 迁移篇:Depth Extraction from Video Using Non-parametric Sampling
  3. (半转载)光在介质中传播,颜色没有变,那到底是频率变了还是波长变了?为什么描述光的颜色时多用波长表示,而很少用频率表示呢?我们平时所说的光的波长到底指的是真空中的波长还是空气中的波长呢?
  4. JFET 共源级放大电路设计
  5. 数据分析如何避免客户流失
  6. 大众点评坐标抓取php,如何抓取(采集)大众点评网的坐标(经纬度)信息
  7. linux qt4.8.3 安装,linux安装qt-everywhere-opensource-src-4.8.3,在进行make的时候出现如下错误:...
  8. 合泰HT32 淘晶驰TJC--T0串口屏学习笔记
  9. Neo4j 完整版安装——neo4j-3.5.6
  10. 怎么样才能在CODELITE中输出中文呢!!!