项目场景:第八章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';
}