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

