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

如何实现仅允许用户输入1-10整数并通过指针存入二维数组

问题修复:二维数组输入校验与指针正确使用

原代码的核心问题

  • 指针初始化错误:p=&movie_Scores; 中movie_Scores是int[8][5]类型,其地址为指向数组的指针(int(*)[8][5]),直接赋值给int*类型的p会导致类型不匹配,触发未定义行为。
  • 输入异常未处理:若用户输入非整数(如字母),scanf读取失败后,错误字符会滞留输入缓冲区,导致后续scanf反复失败,陷入死循环。
  • 逻辑冗余:输入与校验代码重复,可合并简化。

修正后的代码

#include <stdio.h>

int main()
{
    // 8部电影、5个评委的评分二维数组
    int movie_Scores[8][5];
    // 指针指向二维数组首个元素,确保类型匹配
    int *p = &movie_Scores[0][0];
    
    char movie_Names[][100] = {
        "1. Movie 1", "2. Movie 2", "3. Movie 3", "4. Movie 4",
        "5. Movie 5", "6. Movie 6", "7. Movie 7", "8. Movie 8"
    };

    for(int i = 0; i < 5; i++)
    {
        printf("评委 %d,请为每部电影打1-10分:\n\n", i+1);
        for(int j = 0; j < 8; j++)
        {
            int input;
            int read_result;
            do
            {
                printf("%s\t:", movie_Names[j]);
                // 读取输入并检查是否成功获取整数
                read_result = scanf("%d", &input);
                
                // 处理非整数输入
                if(read_result != 1)
                {
                    printf("请输入有效的整数!\n");
                    // 清空输入缓冲区的错误字符
                    while(getchar() != '\n');
                    continue;
                }
                
                // 校验数值范围
                if(input < 1 || input > 10)
                {
                    printf("请输入1-10之间的数字!\n");
                }
            } while(read_result != 1 || input < 1 || input > 10);
            
            // 通过指针将合法值存入数组
            *(p + j*5 + i) = input;
        }
    }

    // 可选:输出验证录入结果
    printf("\n所有评分已录入,结果如下:\n");
    for(int j = 0; j < 8; j++)
    {
        printf("%s:", movie_Names[j]);
        for(int i = 0; i < 5; i++)
        {
            printf("%d ", *(p + j*5 + i));
        }
        printf("\n");
    }

    return 0;
}

关键修正说明

  • 指针正确初始化:int *p = &movie_Scores[0][0]; 直接指向二维数组第一个元素,保证类型匹配,后续指针偏移访问数组元素的行为完全符合C标准定义。
  • 完整输入校验:
    • 检查scanf返回值,判断是否成功读取整数;
    • 遇非整数输入时清空缓冲区,避免死循环;
    • 严格校验输入值是否在1-10范围内。
  • 代码简化:用do-while循环合并输入与校验逻辑,减少重复代码,逻辑更紧凑清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:50:53