该代码可疑:
for ( ctr = 0; ctr < NUM_ELEMENTS; ctr ++) { fread (&elements[ctr], sizeof(struct elementTag), 1, fbin); }
在代码上方,您不检查是否 FOPEN 是否返回NULL,这里不检查结果 FREAD ,所以你认为至少有 NUM_ELEMENTS 文件中的记录。
NUM_ELEMENTS
但主要是你假设文件的内容对应于一系列的方式 ElementTag的 在内存中,因此该文件专用于给定编译器,在给定的体系结构上具有相关的编译选项,您确定吗?
如果您的文件包含其外部表示,则您的阅读方式为false
1 Hydrogen H 2 Helium He ...
char ele[31]; ... scanf("%s", ele);
您没有针对太长输入的保护,并且您没有检查EOF案例
你可以做
if (scanf("%30s", ele) == 1) { for (...
程序能够接受元素名称的任务(不应区分大小写)
你的代码使用
if (strcmp(ele, elements[ctr].Name))
STRCMP 区分大小写,你使用错误的结果,使用 strcasecmp
在
for ( ctr = 0; ctr < NUM_ELEMENTS; ctr ++) { if (strcmp(ele, elements[ctr].Name)) { printf("Atomic Number: %d, Symbol: %s\n\n", elements[ctr].AtomicNumber, elements[ctr].Symbol); } else { printf("NOT FOUND!\n\n"); break; } }
因为错误的使用 STRCMP 除了输入元素是第一个元素之外,你总是会说你找到了第一个元素。正确使用结果 STRCMP 你会经常说 NOT FOUND 除非输入是第一个元素,否则停止查看其他可能性。
NOT FOUND
错误情况必须超出循环或知道循环结束,例如:
for ( ctr = 0; ; ctr ++) { if (ctr == NUM_ELEMENTS) { printf("NOT FOUND!\n\n"); break; } if (!strcasecmp(ele, elements[ctr].Name)) { printf("Atomic Number: %d, Symbol: %s\n\n", elements[ctr].AtomicNumber, elements[ctr].Symbol); break; } }