C++读取TXT多组姓名合并为单数组时出现异常前缀数字问题排查
问题排查与修复方案
你遇到的异常前缀问题由两个核心bug共同导致,排查和修复方法如下:
错误1:未初始化数组 + 误用字符串拼接函数
你在main函数中定义的char students[100][100]是栈区局部变量,未手动初始化的前提下内部是随机垃圾数据。你使用strcat写入姓名,而strcat的逻辑是找到目标字符串的末尾,再追加新内容,垃圾值就会被保留在姓名前面,你看到的6就是存储该位置的残留垃圾值。
修复方法:把
strcat(students[j + n], temp)改为strcpy(students[j + n], temp),直接覆盖写入内容,不需要拼接。如果要更稳妥,可以在定义数组后用memset(students, 0, sizeof(students))把数组全部初始化为空。
错误2:内层循环边界错误
你写的内层循环条件for(int j = 0; j <= studNum; j++)逻辑错误,<=会让循环多执行1次,每一组都会多读1行无效内容,导致后续所有姓名的存储索引错位,进一步放大数据异常。
修复方法:把循环条件改为
for(int j = 0; j < studNum; j++),刚好读取对应数量的姓名行。
补充说明
你注释里疑惑的「数字后为何存在空行」并不是真的空行:>>运算符读取整数时只会读取数字字符,会把当前行末尾的换行符残留在输入缓冲区里,后续getline会直接读到这个换行符得到空串,你那行file.getline(emptyline, 100)的逻辑是正确的,作用就是吃掉这个残留的换行符。
修复后完整代码
#include <iostream> #include <fstream> #include <string.h> using namespace std; void input(const char* fname, int& n, char students[100][100]) { ifstream file(fname); int groups, studNum; char temp[100], emptyline[100]; file >> groups; for(int i = 0; i < groups; i++) { file >> studNum; file.getline(emptyline, 100); // 吃掉数字后的残留换行符 // 循环边界改为< for(int j = 0; j < studNum; j++) { file.getline(temp, 100); // 改为strcpy直接覆盖写入 strcpy(students[j + n], temp); } n += studNum; } file.close(); } int main() { int n = 0; char students[100][100] = {0}; // 初始化数组为全空,更稳妥 input("aigi4153_L2_6.txt", n, students); //打印数组 for(int i = 0; i < n; i++) { cout << students[i] << endl; } return 0; }
内容的提问来源于stack exchange,提问作者danee
相关产品推荐
相关产品推荐

