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

C语言读取txt文件后反转字符串数组的代码问题求解

C语言字符串数组反转逻辑异常修复

基础背景

已实现的文件读取逻辑:

  • 读取txt文件第一行两个整数,存入int类型变量primNum、secNum,其中secNum为后续每行字符串的固定长度
  • 从第二行开始读取所有字符串,存入二维字符数组listOfNumbers
  • 需求:将listOfNumbers倒序存入新数组listOfNumbersReversed,现有反转逻辑运行结果不符合预期

测试样例

测试文件内容

3 8
10000001
11101001
00100101
11000010

预期输出

反转后数组内容为:{"11000010","00100101","11101001","10000001"}

原有异常代码

反转部分的错误实现如下:

//Reversing the array
char listOfNumbersReversed[counter][secNum];
for(i = counter - 1; i>=0; i--){
    int j = 0;
    memcpy(&listOfNumbersReversed[j], &listOfNumbers[i], secNum);
    j++;
}

错误原因分析

  • 数组长度定义错误:C语言规定字符串必须以\0作为结束标识,目标数组第二维长度仅设置为secNum(示例中为8),没有为结束符预留1字节空间,会触发内存越界的未定义行为
  • 索引逻辑错误:目标数组的写入索引j定义在循环内部,每次循环都会被重置为0,j++操作无实际效果,所有拷贝内容都会被写入目标数组的第0个元素,无法按顺序填充所有位置
  • 拷贝逻辑错误:使用memcpy仅拷贝secNum长度的字节,没有拷贝字符串结束符,结合数组长度不足的问题,会导致printf输出字符串时读取到相邻内存的垃圾值

修正后代码

// 反转数组:第二维长度+1预留结束符空间
char listOfNumbersReversed[counter][secNum + 1];
int j = 0; // 写入索引初始化放在循环外部
for(i = counter - 1; i >= 0; i--){
    strcpy(listOfNumbersReversed[j], listOfNumbers[i]);
    j++;
}

修改点说明

  • 目标数组第二维长度设置为secNum + 1,预留字符串结束符存储空间,避免内存越界
  • 将写入索引j的初始化移到循环外部,每次拷贝完成后递增索引,保证原数组倒序的元素依次填入目标数组的对应位置
  • 替换memcpy为strcpy,自动完成字符串全量拷贝(包含结束符),不需要手动计算拷贝长度,减少长度计算错误

注:本场景中通过fscanf读取的字符串会自动在末尾添加\0结束符,符合strcpy的使用要求


内容的提问来源于stack exchange,提问作者LearningLinux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:48:25