零开始的C语言学习之路——谭浩强教材课后题实践记录与问题解析②

文章讲述了在C语言中,连接两个字符串时需要注意字符数组的内存分配,特别是结束标志0的占用。函数`voidConnect_Str`初始版本导致数组溢出,修正后的版本需手动在连接后添加结束标志以确保正确性。
摘要由CSDN通过智能技术生成

项目场景:第八章T6

写一个函数,将两个字符串连接


问题描述

数组的字符结束标志'\0'占用数组的一个元素吗?

字符串的结束标志确实占一个元素。这个结束标志是字符\0,它的ASCII值为0,表示空字符,它被用于标记字符串的结束。在内存中存储字符串时,除了实际的字符序列外,还必须包含这个\0字符。因此,当你声明一个字符数组来存储字符串时,数组的大小至少要能容纳字符串的所有字符加上这个结束符 \0

例如,如果你有一个字符串 "hello",它实际上在内存中占用的空间是6个字节,包括5个可见字符 'h''e''l''l''o' 以及一个不可见的结束符 \0。所以在声明字符数组时,即使你看到的是5个字符的字符串,也需要为其分配至少6个字符的空间

char str[6] = "hello"; // 正确的声明方式,包含了结束符 '\0'

实践分析:

void Connect_Str(char str1[], char str2[])
{
	int i=0, j;
	while (str1[i] != '\0')
		i++;
	for (j = i, i = 0; j < 100; j++, i++)
		str1[j] = str2[i];
}

第一次代码是想先找到字符数组str1中的'\0',并记录它的位置(计算str1有多少个字符),找到结尾后将srt2的开头放到'\0'开始的位置。 

结果:报错 stack around the variable 'b' was corrupted

分析:

①首先在main中定义了str1[20], 那么j<100的循环就超出了数组的最大范围,报错。

②str2的字符放到str1后,在最后没有加'\0'(我以为系统会自己加'\0')。

“c系统不是会自己自动添加结束符'\0'吗?”以下是回答:


解决方案:

自己手动在结尾处添加'\0'

void Connect_Str(char str1[], char str2[])
{
	int i=0, j;
	while (str1[i] != '\0')
		i++;
	for (j = 0; str2[j] != '\0'; j++)
		str1[i+j] = str2[j];
    str1[i + j] = '\0';
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值