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

C风格文件处理:使用char类型操作字符串读取文件数据遇到故障

问题排查及解决方案

核心错误点

  • 存储姓名的数组类型错误:原代码中char names[128]是一维字符数组,仅能存储单个字符串,无法存储多个独立的姓名字符串,需改为二维字符数组char names[128][20],每个元素存储一个姓名。
  • fscanf格式符使用错误:原代码用%c仅能读取单个字符,需使用字符串匹配格式符;同时默认%s以空白字符为分隔符,适配本次逗号分隔的输入格式,应使用%[^,]匹配逗号前的所有姓名内容。
  • 姓名赋值逻辑错误:原代码*(namesArr + i) = *name仅拷贝了姓名的第一个字符,需使用strcpy函数拷贝整个字符串,需要引入<string.h>头文件。
  • 函数参数类型不匹配:ReadFile的第一个参数需要接收二维字符数组,需将参数类型从char*改为char (*)[20]。
  • 打印语句参数错误:printf输出字符串的%s占位符需要传入字符串首地址,原代码*(names+i)是单个字符,会触发内存访问错误。

修改后可运行代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h> // 引入字符串处理头文件

using namespace std;

// 修改第一个参数类型,适配二维字符数组传参
int ReadFile(char (*)[20],int*,double*);

int main()
{
    char names[128][20]; // 二维数组存储多条姓名数据
    int ages[128];
    double salaries[128];

    int size = ReadFile(names, ages, salaries);
    cout << endl;

    for(int i = 0; i < size; i++)
    {
        printf("My name is %s, and I am %d years old. My salary is $%.2lf\n", names[i], ages[i], salaries[i]);
    }

    return 0;
}

int ReadFile(char (*namesArr)[20], int *ageArr, double *salaryArr)
{
    FILE *IN = fopen("Input.txt", "r");
    int i = 0;
    if(IN == NULL)
    {
        cout << "Error! Can't open file.";
        exit(1);
    }
    else
    {
        char name[20];
        int age = 0;
        double salary = 0.00;
        // %[^,]匹配逗号前的所有字符作为姓名,后续匹配年龄、薪资
        while(fscanf(IN, "%[^,],%d,%lf\n", name, &age, &salary) != EOF)
        {
            strcpy(namesArr[i], name); // 完整拷贝姓名到数组对应位置
            ageArr[i] = age;
            salaryArr[i] = salary;
            cout << namesArr[i] << " ";
            i++;
        }
    }
    fclose(IN);
    return i;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:57:03