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

C语言自定义字符串拼接程序第二个for循环无运行效果问题咨询

问题原因分析

导致第二个循环看似没有执行效果的核心原因有3处:

  • 第一个for循环错误复制了字符串终止符:strnlen返回的是不包含\0的字符串长度,你使用i <= string1Len作为循环条件,会把string1末尾的\0一起复制到string3的string1Len下标位置。C语言中字符串以\0作为结束标记,printf输出时碰到这个提前写入的\0就会停止,自然看不到后续拼接的内容,误以为第二个循环没有执行。
  • 第二个for循环的string2索引逻辑错误:第二个循环的变量i是string3的偏移量,你直接用i作为string2的下标,访问到的是string2超出自身长度的非法内存,根本取不到string2的有效字符,极端情况还会触发段错误。
  • 终止符写入位置越界:你声明的string3总长度为string1Len + string2Len + 1,合法下标范围是0 ~ string1Len + string2Len,你写入\0的位置string1Len + string2Len + 1已经超出数组边界,属于未定义行为。
修正后的代码
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
  // 增加参数合法性判断,避免未传参时的非法访问
  if (argc < 3) {
      printf("请传入两个字符串参数\n");
      return 1;
  }
  char *string1 = argv[1];
  char *string2 = argv[2];

  int string1Len = strnlen(string1, 50);
  int string2Len = strnlen(string2, 50);

  char string3[string1Len + string2Len + 1];

  // 仅复制string1的有效字符,不包含终止符
  for (int i = 0; i < string1Len; i++)
  {
    string3[i] = string1[i];
  }

  // 调整string2的索引逻辑,从0开始取有效字符
  for(int i = string1Len; i < string1Len + string2Len; i++)
  {
    string3[i] = string2[i - string1Len];
  }

  // 在合法的最后位置写入终止符
  string3[string1Len + string2Len] = '\0';

  printf("%s %d %d\n", string3, string1Len, string2Len);

  return 0;
}
修正逻辑说明
  • 调整第一个for循环的判断条件为i < string1Len,仅复制string1的有效字符,避免提前写入终止符
  • 第二个for循环的起始位置调整为string1Len,承接第一个循环的末尾位置,同时将string2的索引改为i - string1Len,保证从string2的第一个字符开始取
  • 终止符写入位置调整为string3的最后一个合法下标,避免数组越界

内容的提问来源于stack exchange,提问作者Lew Ashby 85

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:24:03