C语言使用scanf向数组录入元素时最后一个输入值不生效如何解决
问题原因
你的程序存在两个核心错误,对应你观察到的异常表现:
- 打印格式控制符不匹配
你定义的ReqMean是double类型,但printf输出时使用了仅适用于int类型的%d格式符,这属于C语言的未定义行为,你看到的输出值0并不是变量实际存储的数值,是格式符使用错误导致的输出异常。如果要打印double类型的数值,请改用%lf或者%f格式符。 - 业务逻辑不符合预期
按照你当前的代码逻辑,输入的所有数值里,最后一个会被单独取出赋值给ReqMean,不会被算作成绩存入数组的有效成绩范围内:
- 你输入
10、32、20三个数值时,numgrade会被累加为3,随后ReqMean = grades[numgrade -1]也就是把grades[2]里的20赋值给了ReqMean,这个值本身不会被统计到有效成绩里。如果你预期输入的三个值都是成绩,那你不应该从成绩数组末尾取值作为ReqMean,应该单独增加一行scanf读取期望均值。
修复后的参考代码
#include <math.h> #include <stdio.h> #include <stdbool.h> #define N 50 #define MaximalSTD 10 int main() { printf("Please enter the grades of the examinees"); printf(" followed by the expected mean\n"); double grades[N], ReqMean; int numgrade = 0; for (int i = 0; i < N; i++) { if (scanf("%lf", &grades[i]) == 1) { numgrade++; } else break; } ReqMean = grades[numgrade - 1]; // 替换适配double类型的格式符 printf("numgrade: %d\nReqMean: %lf\n", numgrade, ReqMean); // 可新增打印验证grades[2]的实际存储值 printf("grades[2]实际存储值:%lf\n", grades[2]); return 0; }
内容的提问来源于stack exchange,提问作者Arie Creson
相关产品推荐
相关产品推荐

