C语言学生测验平均分计算程序输入Unknown无法终止问题求助
C语言学生测验分数计算程序故障修复方案
核心问题原因
- 姓名输入地址越界:
scanf("%s", &name[32]);写法错误,&name[32]指向长度为32的字符数组的末尾边界,输入内容会写入数组外的非法内存,导致name变量无法正确存储用户输入的姓名 - 字符串比较逻辑错误:C语言中不能用
==直接对比两个字符串的内容,==只会比较两个字符数组的首地址,永远返回假,必须用<string.h>头文件提供的strcmp函数对比字符串内容 - 大小写匹配错误:终止判断的目标字符串是小写
unknown,而预期的触发输入是首字母大写的Unknown,大小写不一致也会导致判断失败 - 平均分计算逻辑残缺:原代码输出语句中的求和逻辑不完整,且没有做除以4的平均计算
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() { char name[32]; int grade1; int grade2; int grade3; int grade4; // 调整为和预期输入一致的大小写,也可改用不区分大小写的比较函数 char end[32] = "Unknown"; begin: printf("Welcome to the student Quiz Calculator Program.\n"); printf("Enter a Student Name: "); // 修正输入地址,数组名name本身就是数组首地址 scanf("%s", name); // 用strcmp比较字符串内容,返回0表示两个字符串完全匹配 if (strcmp(name, end) == 0) { goto terminate; } else { printf("Enter quiz grade 1: "); scanf("%d", &grade1); printf("Enter quiz grade 2: "); scanf("%d", &grade2); printf("Enter quiz grade 3: "); scanf("%d", &grade3); printf("Enter quiz grade 4: "); scanf("%d", &grade4); // 补全平均分计算逻辑 int average = (grade1 + grade2 + grade3 + grade4) / 4; printf("Average Quiz Calculation for %s with grades of %d, %d, %d, and %d is %d.\n", name, grade1, grade2, grade3, grade4, average); goto begin; } terminate: printf("have a nice day"); return 0; }
可选优化
如果需要支持不区分大小写的终止触发(输入unknown、UNKNOWN都可以退出程序),可以将判断语句替换为:
if (strcasecmp(name, end) == 0)
内容的提问来源于stack exchange,提问作者Roger Bunting
相关产品推荐
相关产品推荐

