C 中字符串末尾的两个空终止符号



我正在通过"C编程语言"一书学习C。在其中一个需要连接两个字符串的练习中,我发现结果字符串的末尾有两个空终止符号 (\0(。这正常吗?

函数的代码:

void
copy_str_to_end(char *target, char *destination)
{
while (*destination != '')
++destination;
while ((*destination++ = *target++) != '')
;
}

输出:This is a destination. This is a target.这里似乎一切正常,但是如果我运行此函数进行测试:

void
prcesc(char *arr)
{
int i;
for (i = 0; i <= strlen(arr) + 1; i++)
if (arr[i] != '')
printf("%c", arr[i]);
else
printf("E");
printf("n");
}

问题变得可见:This is a destination. This is a target.EE(E 表示 \0(那么,我应该担心这个还是不担心?如果是,发生这种事情的原因是什么?

问题基本上是由在for循环条件中使用<=运算符而不是<运算符引起的:

i <= strlen(arr) + 1

strlen(arr) + 1给出数组中元素的数量,arr在调用方(实际上包含字符串(中指向

。当您使用i <= strlen(arr) + 1循环迭代次数比预期多一次,并且您尝试在最后一次迭代时访问超出数组边界的元素

if (arr[i] != '')

因为索引计数从0开始,而不是1

访问超出数组边界的内存会调用未定义的行为。

输出中额外的 E 是因为您在 prcesc 函数中运行 while 循环,因为 i = strlen(arr( + 1 也。 strlen 返回字符串的长度,比如说 'n'。所以 arr[n-1] 是字符串的最后一个元素,来自 arr[n] 的所有元素都是 '\0'。 因此,当您迭代 arr[n]、arr[n+1] 时,您会得到两个空字符。

您需要以下功能:

void
prcesc(char *arr)
{
int i;
for (i = 0; i <= strlen(arr); i++)
if (arr[i] != '')
printf("%c", arr[i]);
else
printf("E");
printf("n");
}

最新更新