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
相关产品推荐
相关产品推荐

