使用scanf读取多值存入数组遇阻:需验证6整数并存储4个三角形坐标
嘿,我来帮你搞定这个scanf读取三角形坐标的问题!从你的描述来看,核心问题应该是输入验证不严谨和数组存储逻辑没捋顺这两点,咱们一步步来解决:
1. 先把输入验证做扎实:确保每次读到6个有效整数
scanf的返回值是成功读取的变量个数,这是验证输入是否有效的关键!每次调用scanf读取6个坐标后,一定要检查返回值是不是6——如果不是,说明用户输入了非整数或者数量不对,这时候必须清理输入缓冲区的垃圾数据,不然会干扰下一次读取。
举个验证的代码片段:
int read_result; // 读取6个整数,对应三角形的(x1,y1,x2,y2,x3,y3) read_result = scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3); if (read_result != 6) { printf("输入出错啦!请输入6个整数形式的坐标\n"); // 清空输入缓冲区里的残留字符(比如字母、多余的符号) while (getchar() != '\n'); // 这里可以加循环让用户重新输入当前三角形的坐标 continue; }
2. 正确把坐标存入二维数组
因为要存4个三角形,每个6个坐标值,咱们可以定义一个二维数组int triangles[4][6];,每次读取到有效输入后,把6个值依次存入对应的数组行就行(注意数组索引从0开始,第1个三角形存在triangles[0],第4个在triangles[3])。
给你一个完整的示例代码,直接就能用:
#include <stdio.h> int main() { // 定义二维数组:4个三角形,每个6个坐标值(x1,y1,x2,y2,x3,y3) int triangles[4][6]; int triangle_idx; for (triangle_idx = 0; triangle_idx < 4; triangle_idx++) { printf("请输入第%d个三角形的6个坐标(格式:x1 y1 x2 y2 x3 y3):\n", triangle_idx + 1); // 读取6个坐标到当前三角形的数组行 int read_count = scanf("%d %d %d %d %d %d", &triangles[triangle_idx][0], &triangles[triangle_idx][1], &triangles[triangle_idx][2], &triangles[triangle_idx][3], &triangles[triangle_idx][4], &triangles[triangle_idx][5]); // 验证输入是否有效 if (read_count != 6) { printf("输入格式不对!请重新输入6个整数哦~\n"); // 清空输入缓冲区,避免残留的错误字符影响下一次读取 while (getchar() != '\n'); triangle_idx--; // 让当前循环重新执行,重新输入当前三角形的坐标 continue; } // 可选:打印验证一下存入的坐标是否正确 printf("已成功存入坐标:"); for (int coord_idx = 0; coord_idx < 6; coord_idx++) { printf("%d ", triangles[triangle_idx][coord_idx]); } printf("\n"); } // 这里可以添加对triangles数组的后续处理逻辑(比如计算面积、判断形状等) return 0; }
3. 常见坑点排查
- 输入缓冲区残留问题:如果用户输入了字母、符号这类非整数,scanf会读取失败,这些垃圾字符会留在输入缓冲区里,导致下一次scanf直接读取到这些无效内容,所以必须用
while(getchar() != '\n')清空缓冲区。 - 数组越界问题:别搞混数组索引!4个三角形的索引是0到3,要是写成
triangles[4]就会越界,引发程序异常。 - 输入格式灵活性:scanf格式串里的空格会匹配任意空白字符(空格、换行、制表符),所以用户不管是一行输入6个值,还是分几行输入,只要是6个整数都能正确读取,这点不用纠结。
内容的提问来源于stack exchange,提问作者Ania
相关产品推荐
相关产品推荐

