C语言中copy函数先后复制长短字符串,目标数组为何未合并?
问题解答
代码与场景说明
给出的字符串复制函数:
/* copy: copy 'from' into 'to'; assume to is big enough */ void copy(char to[], char from[]) { int i; i = 0; while ((to[i] = from[i]) != '\0') { ++i; } }
使用的字符数组:
char line[1000]; char longest[1000];
操作流程:
- 先将
line赋值为"Hello",调用copy(longest, line),此时longest存储"Hello"(以\0结尾)。 - 再给
line赋值更短的字符串(比如"Hi"),再次调用copy(longest, line),发现longest变成了"Hi",而非合并后的"HelloHi"。
原因分析
- 函数的覆盖逻辑:你的
copy函数是从to数组的**起始位置(索引0)**开始逐个覆盖字符。每次复制都会把from的字符依次写入to[0]、to[1]……直到遇到from的结束符'\0',同时会把这个'\0'也写入to。 - 字符串的结束标志:C语言中字符串以
'\0'作为结束标记。第一次复制后,longest的前6个位置是H e l l o \0;第二次复制时,"Hi"的H、i、'\0'会分别覆盖longest[0]、longest[1]、longest[2]。此时longest[2]是'\0',后续的l o虽然还在数组里,但不会被当作有效字符串内容,所以最终看到的是替换后的"Hi"。
实现追加(合并)的修改方案
如果想要把新字符串追加到现有字符串后面,需要先找到to的末尾(即当前'\0'的位置),再从该位置开始复制from的内容。修改后的函数示例:
void str_append(char to[], char from[]) { int i = 0, j = 0; // 定位到to的末尾 while (to[i] != '\0') { i++; } // 从末尾开始复制from的内容 while ((to[i + j] = from[j]) != '\0') { j++; } }
调用这个str_append函数就能实现字符串合并的效果。
内容的提问来源于stack exchange,提问作者mpriv8
相关产品推荐
相关产品推荐

