如何优化考试用C语言程序代码以避免Time Limit Error(超时错误)
解决C语言程序超时问题的优化方案
首先一眼就揪出了导致超时的核心问题:你用"w"模式打开input.txt了!这个模式是写入模式,会直接清空文件甚至创建新空文件,根本没办法读取原有内容。fscanf在这种场景下会一直读取失败,变量a的初始值是未定义的随机值,如果这个随机值不是0,程序就会陷入无限死循环,直接触发Time Limit Error。
下面是修复并优化后的完整代码:
#include <stdlib.h> #include <stdio.h> int main() { int a, sum = 0, count = 0; double average; // 以只读模式打开输入文件,这是读取内容的正确姿势 FILE *file1 = fopen("input.txt", "r"); if (file1 == NULL) { fprintf(stderr, "无法打开输入文件 input.txt\n"); return EXIT_FAILURE; } // 循环读取:只有成功读到整数且数值不是0时,才累加计数 while (fscanf(file1, "%d", &a) == 1 && a != 0) { sum += a; count++; } fclose(file1); // 防御性判断:避免没有有效数据时出现除以0的崩溃 if (count == 0) { fprintf(stderr, "没有有效的输入数据\n"); return EXIT_FAILURE; } average = (double)sum / count; printf("%.2f\n", average); // 可指定小数位数让输出更规整 // 写入输出文件,同时增加打开失败的判断 FILE *file2 = fopen("output.txt", "w"); if (file2 == NULL) { fprintf(stderr, "无法打开输出文件 output.txt\n"); return EXIT_FAILURE; } fprintf(file2, "%.2f", average); fclose(file2); return EXIT_SUCCESS; }
关键改进说明:
- 修复文件打开模式:将
input.txt的打开模式从"w"改为"r"(只读模式),确保能正确读取文件内容。 - 添加错误处理:检查文件是否成功打开,避免因文件不存在、权限不足等问题导致的隐藏错误。
- 优化循环逻辑:直接通过
fscanf的返回值判断读取是否成功,彻底避免死循环的可能。 - 变量类型优化:用整数类型
count代替浮点型i计数更合理;用double计算平均值,提升精度。 - 防御性编程:增加
count为0的判断,防止没有有效输入时出现除以0的崩溃。 - 输出格式优化:指定小数位数(如
%.2f)让输出更规范美观。
内容的提问来源于stack exchange,提问作者Vgeorgy
相关产品推荐
相关产品推荐

