【发布时间】:2016-04-28 19:27:50
【问题描述】:
我正在学习 C。我编写了程序来从文本文件中读取数据并将其打印出来。在构建过程中编译器没有给出错误。但是,当我尝试运行它时,程序崩溃了。我检查了当printTable 函数被删除时,程序运行并在main() 中打印循环中的内容。我还尝试删除变量“total”,但程序仍然崩溃。有什么问题?
#include<stdio.h>
#include<stdlib.h>
typedef struct{
char *country;
int females;
int males;
}person_count;
void printTable(person_count *data[]){
printf("Country Females Males Total\n");
int i;
int total[158];
for(i=0;i<158;i++){
total[i]=data[i]->females+data[i]->males;
printf("%15s %7i %7i %8i\n",data[i]->country,data[i]->females,data[i]->males,total[i]);
}
}
int main(){
person_count *data[158];
FILE *eduData=fopen("SecondaryEd2005.txt","r");
if(eduData==NULL){
printf("File not found.");
exit(1);
}
printf("File opened successfully.\n");
int k;
for(k=0;k<158;k++){
data[k]=malloc(sizeof(person_count));
char place[20];
fscanf(eduData,"%s %i %i\n",place,&data[k]->females,&data[k]->males);
data[k]->country=place;
printf("%s %i %i\n",data[k]->country,data[k]->females,data[k]->males);
}
printTable(data);
fclose(eduData);
return 0;
}
txt文件内容示例:
比利时 391138 423401 伯利兹 15591 15786 贝宁 154266 281183 百慕大 2494 2262 不丹 19870 22274
【问题讨论】:
-
data[k]->country=place- 该缓冲区再次用于下一个条目(以及下一个等),每次都悬空,因为一旦达到每个 for 循环范围,place[]就会丢失迭代。 -
您输入文件中的任何国家/地区是否超过 19 个字符?
-
是的,确实有大小为25左右的国家。谢谢,我将 place[] 的大小更改为 30 并且程序运行。但是,printTable 只打印一个国家 - 文件中的最后一个国家。我认为 WhozCraig 对此进行了说明。我怎样才能改变它?