You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
}

代码问题分析

  1. 数组下标错误:循环从i=1开始,数组下标应从0开始,否则会浪费第一个数组元素,且循环条件i<n会导致最多录入n-1个元素
  2. 函数返回逻辑错误:enter函数最后调用main()是错误操作,应该返回已成功录入的整数数量
  3. 重复调用与参数错误:菜单中连续两次调用enter函数,且第二次调用时nrOfMeasurements初始值未初始化,参数传递逻辑混乱
  4. 输入缓冲区未清理:当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;
}

修正说明

  1. 跟踪录入数量:nrOfMeasurements初始化为0,每次调用enter函数时传入剩余需要录入的数量(10 - nrOfMeasurements),函数返回本次录入的数量,累加后更新nrOfMeasurements
  2. 数组下标正确使用:从10 - remaining + i位置开始存储,确保已录入的元素不会被覆盖
  3. 清理输入缓冲区:当scanf失败时,用while (getchar() != '\n')清空缓冲区,避免后续输入受影响
  4. 函数返回值正确:enter函数返回本次成功录入的数量,用于更新全局跟踪变量
  5. 菜单逻辑优化:增加判断,当已录入10个整数时提示用户,避免重复录入

内容的提问来源于stack exchange,提问作者lata27

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:10:39