C中哪些方式定义的字符串,其末尾会自动添加‘\0’

'\0'就是8位的00000000,因为字符类型中并没有对应的这个字符,所以这么写。'\0'就是 字符串结束标志。

'\0'是转译字符,意思是告诉编译器,这不是字符0,而是空字符。空字符\0对应的二进制为00000000,而数字0为00110000

原来,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不必再用字符数组的长度来判断字符串的长度了。

字符串结束标志为‘\0’

判断一个字符串是否结束的标志就是看是否遇到‘\0’,如果遇到‘\0’,则表示字符串结束。

1、字符数组:
(1)、char str[]="12345";

或给字符串加上大括号:char str[]={"12345"};

或 char str[6]="12345"

这种方法定义时,系统会自动在字符串的末尾加上字符串结束符,即 ‘\0’,

(2)、char str[10]={'1','2','3','4','5'};

这种方法定义时,系统会自动从未初始化的元素开始,将之后的元素赋为\0,如上面的数组str中的元素实际上是:'1','2','3','4','5','\0','\0','\0','\0','\0'

(3)、char str[]={'1','2','3','4','5'};

这种方法定义时,系统不会自动在字符串的末尾加上字符串结束符;

此时用sizeof()函数可以正确求出其所占的内存大小;但用strlen()函数不能正确求出其长度,因为strlen是通过\0判断字符串结束的。

所以,采用该方法定义时,一般人为地加上\0,即char str[]={'1','2','3','4','5', '\0'};

既:

char str[]={'1','2','3','4','5', '\0'};

char str[6]={'1','2','3','4','5'}; //故意给数组预留一个空位

char str[]={“12345”};

 代码提示

#include <iostream>
#include <string.h>
using namespace std;
 
int main()
{
	char str1[] = "12345";
	char str2[10] = { '1','2','3','4','5' };
	const char *str3 = "12345";
	char str4[] = { '1','2','3','4','5',0 };
	char str5[] = { '1','2','3','4','5' };
 
	printf("%d,%d,%d,%d,%d,%d\n", str2[5], str2[6], str2[7], str2[8], str2[9], str3[4]);
	printf("各个字符串为:%s,%s,%s,%s,%s\n", str1, str2, str3, str4, str5);
	printf("各个字符串的所占的内存大小为:%d,%d,%d,%d,%d\n", sizeof(str1), sizeof(str2), sizeof(str3), sizeof(str4), sizeof(str5));
 
	printf("各个字符串的有效长度为:%d,%d,%d,%d,%d\n", strlen(str1), strlen(str2), strlen(str3), strlen(str4), strlen(str5));
 
	printf("%d\n", strcmp(str1, str3));
	printf("%d\n", strcmp(str1, str5));
	return 0;
}

运行结果:

2、字符指针
只能采用字符串的方式初始化:char *str3="12345";

注意:字符指针可以用字符串常量初始化和赋值;

即:char *str3;str3="12345";也是可以的

此时也可以用str3[4]的形式访问其中的元素,如cout<< str3[4];就会输出str指向的字符串的第五个元素,即元素'5'。

该方法也是自动加上了字符串结束符的。

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

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

三、C语言中,利用宏定义一个字符串和字符数组,定义的字符串其末尾都会自动添加 ‘\0’ 字符吗?

答案是:会自动添加‘\0’,用程序进行验证:

#include <stdio.h>
 
#define MYPHONE "AT+CMGS"
unsigned char SMS[] = "HELLO, WELCOME TO RCCTS!";
unsigned char *String;
unsigned char i = 0;
 
void main()
{
	printf("**************this procedure is to confirm \\0 's exist****************\n");
	/********************************验证MYPHONE字符串末尾是否有\0字符*************************/
	String = MYPHONE;
	while (*String)               //当*String所指向的字符等于\0时跳出循环
	{
		i = *String;
		printf("%c", i);
		String++;
 
	}
	if (*String == '\0') {          //再次确认字符串的末尾是否有\0字符存在
		printf("\\0");          //有则打印出来
	}
	else {
		printf("**");          //没有则打印**
	}
	printf("\n");
	printf("MYPHONE=%s\n", &MYPHONE);          //打印字符串 这里%s的s必须为小写
 
/**************验证SMS字符串末尾是否有\0字符****************/
	String = SMS;
	while (*String)               //当*String所指向的字符等于\0时跳出循环
	{
		i = *String;
		printf("%c", i);
		String++;
 
	}
	if (*String == '\0') {          //再次确认字符串的末尾是否有\0字符存在
		printf("\\0");          //有则打印出来
	}
	else {
		printf("**");          //没有则打印**
	}
	printf("\nSMS=%s\n", &SMS);          //打印字符串 这里%s的s必须为小写
}

运行结果:

  • 29
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值