C语言作业问题:实现可中断整数录入并跟踪已录入数量
问题与代码修正
需求说明
编写一个整数录入函数,满足以下要求:
- 总共需要录入10个整数
- 用户输入字母等非数字内容时,立即返回主菜单
- 需跟踪已录入的整数数量,下次录入时仅允许补录剩余数量的整数(例如录入6个后退出,下次仅能再录4个)
原有代码
录入整数的函数
int enter(int a[], int n){ int i; for( i=1; i<n;i++){ printf("Enter measurement #%d ", i); if(scanf(" %d", &a[i]) == 1){ } else{ printf("Exit!"); break; } } main();
main函数中的变量
int nrOfMeasurements; int measurements[10];
菜单中的函数调用(嵌套在while循环内)
if(ch == 'e'){ enter(measurements,10); nrOfMeasurements = enter(measurements,nrOfMeasurements); }
代码问题分析
- 数组下标错误:循环从
i=1开始,数组下标应从0开始,否则会浪费第一个数组元素,且循环条件i<n会导致最多录入n-1个元素 - 函数返回逻辑错误:
enter函数最后调用main()是错误操作,应该返回已成功录入的整数数量 - 重复调用与参数错误:菜单中连续两次调用
enter函数,且第二次调用时nrOfMeasurements初始值未初始化,参数传递逻辑混乱 - 输入缓冲区未清理:当
scanf读取非数字失败时,错误字符会留在输入缓冲区,导致后续输入一直读取错误内容
修正后的代码
修正后的录入函数
#include <stdio.h> #include <stdlib.h> int enter(int a[], int remaining) { int count = 0; // 从剩余需要录入的数量开始循环 for (int i = 0; i < remaining; i++) { printf("Enter measurement #%d ", (10 - remaining + i + 1)); if (scanf("%d", &a[10 - remaining + i]) == 1) { count++; } else { printf("Exit!\n"); // 清理输入缓冲区的错误字符 while (getchar() != '\n'); break; } } return count; // 返回本次成功录入的数量 }
修正后的main函数示例
int main() { int nrOfMeasurements = 0; // 初始化为0,跟踪已录入数量 int measurements[10]; char ch; while (1) { // 显示主菜单 printf("\nMain Menu\n"); printf("e - Enter measurements\n"); printf("q - Quit\n"); printf("Enter choice: "); scanf(" %c", &ch); if (ch == 'e') { if (nrOfMeasurements >= 10) { printf("All measurements are already entered!\n"); continue; } // 计算剩余需要录入的数量,调用enter函数并更新已录入数量 int added = enter(measurements, 10 - nrOfMeasurements); nrOfMeasurements += added; printf("Total entered so far: %d\n", nrOfMeasurements); } else if (ch == 'q') { printf("Exiting program.\n"); break; } else { printf("Invalid choice!\n"); // 清理输入缓冲区 while (getchar() != '\n'); } } return 0; }
修正说明
- 跟踪录入数量:
nrOfMeasurements初始化为0,每次调用enter函数时传入剩余需要录入的数量(10 - nrOfMeasurements),函数返回本次录入的数量,累加后更新nrOfMeasurements - 数组下标正确使用:从
10 - remaining + i位置开始存储,确保已录入的元素不会被覆盖 - 清理输入缓冲区:当
scanf失败时,用while (getchar() != '\n')清空缓冲区,避免后续输入受影响 - 函数返回值正确:
enter函数返回本次成功录入的数量,用于更新全局跟踪变量 - 菜单逻辑优化:增加判断,当已录入10个整数时提示用户,避免重复录入
内容的提问来源于stack exchange,提问作者lata27
相关产品推荐
相关产品推荐

