空字符'\0'与字符串

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等)。

猜你喜欢

转载自blog.csdn.net/heybeaman/article/details/81358400