我正在通过"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");
}