You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"。

原因分析

  1. 函数的覆盖逻辑:你的copy函数是从to数组的**起始位置(索引0)**开始逐个覆盖字符。每次复制都会把from的字符依次写入to[0]、to[1]……直到遇到from的结束符'\0',同时会把这个'\0'也写入to。
  2. 字符串的结束标志: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:50:28