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

C语言读取文件到结构体数组报错,求代码问题排查与修正

动物信息读取程序报错问题排查

程序目标

读取包含各类动物名称(部分全大写、部分全小写)的文本文件,将信息存入struct animal类型数组allAnimals[6],随后利用该结构体输出动物名称、ID及名称的大小写状态。

当前代码

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

int main(){
    FILE *fptr;
  
    fptr = fopen("all_animals.txt", "r");
    if (fptr == NULL) {
        printf("Error! File cannot be opened");
        exit(1);
    }

    for (int i=0; i<6;i++){
        fscanf(fptr, "%s",allAnimals[i].name);
    }

    return(0);
}

int isUppercaseAnimal(char animal[50]){
    for(int j=0; j< strlen(animal); j++){
        if(isupper(animal[j])){
            return(1);
        }else{
            return(0);
        }//else
    }//j
}//isUpperCase


struct animal allAnimals[6];
struct animal{
    char name[50];
    int animal_Id;
    int isUpperCase;
};

int print(char s[50], int n, int c){
    if(c == 1) printf("ID: %d
 Name: %s
 This animals is written in all capitals
",n,s);
    if(c == 0) printf("ID: %d
 Name: %s
 This animals is written in all lowercase
",n,s);
    return(0);
}

代码存在的问题

  • 结构体定义顺序错误:C语言要求必须先定义结构体类型,才能用该类型声明变量。代码中先声明了struct animal allAnimals[6];,后定义struct animal,编译器无法识别struct animal类型,直接触发编译错误。
  • isUppercaseAnimal函数逻辑完全错误:函数仅检查第一个字符的大小写就返回结果,无法判断整个字符串是否为全大写。例如"Cat"会被误判为全大写,而实际是混合大小写。正确逻辑应该是遍历所有字符,只有全部字符都是大写时才返回1,否则返回0。
  • 结构体字段未赋值:仅读取了动物名称到name字段,animal_Id和isUpperCase字段未做任何赋值,后续使用时会是随机垃圾值,无法输出正确结果。
  • 核心函数未调用:主函数仅完成文件读取,没有调用isUppercaseAnimal判断大小写状态,也没有调用print函数输出结果,程序执行后无预期输出。
  • 打印函数换行符错误:printf中用 表示换行是错误写法,C语言中必须用\n,否则会导致编译错误或输出格式混乱。
  • 命名不规范:isUppercaseAnimal函数的结尾注释写的是//isUpperCase,名称不一致容易造成混淆。

修正后的代码示例

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>

// 先定义结构体类型
struct animal{
    char name[50];
    int animal_Id;
    int isUpperCase;
};

// 声明结构体数组
struct animal allAnimals[6];

// 修正全大写判断逻辑:所有字符都是大写才返回1
int isUppercaseAnimal(char animal[50]){
    int len = strlen(animal);
    for(int j=0; j<len; j++){
        if(!isupper(animal[j])){
            return 0;
        }
    }
    return 1;
}

// 修正换行符,优化判断逻辑
int print(char s[50], int n, int c){
    if(c == 1){
        printf("ID: %d\n Name: %s\n This animal is written in all capitals\n", n, s);
    } else {
        printf("ID: %d\n Name: %s\n This animal is written in all lowercase\n", n, s);
    }
    return 0;
}

int main(){
    FILE *fptr = fopen("all_animals.txt", "r");
    if (fptr == NULL) {
        printf("Error! File cannot be opened");
        exit(1);
    }

    for (int i=0; i<6; i++){
        // 读取动物名称
        fscanf(fptr, "%s", allAnimals[i].name);
        // 赋值ID(用索引+1作为唯一ID)
        allAnimals[i].animal_Id = i + 1;
        // 判断并赋值大小写状态
        allAnimals[i].isUpperCase = isUppercaseAnimal(allAnimals[i].name);
        // 调用打印函数输出信息
        print(allAnimals[i].name, allAnimals[i].animal_Id, allAnimals[i].isUpperCase);
    }

    // 关闭文件,避免资源泄漏
    fclose(fptr);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:10:28