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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:06:07