如何实现仅允许用户输入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
相关产品推荐
相关产品推荐

