C语言四则运算计算器如何实现按用户意愿重复执行功能
问题原因分析
- 输入缓冲区残留换行符导致
scanf("%c", &q)没有读取到用户实际输入的选择值:前面所有scanf读取数字、浮点数的时候,只会读取对应格式的内容,用户输入结束按下的回车产生的\n字符会残留在输入缓冲区。后续执行scanf("%c", &q)时,%c可以读取任何字符包括空白符,所以会直接把残留的\n读入变量q,根本不会等待用户输入y/n,自然无法触发继续执行的逻辑。 - 递归调用main函数属于C语言未定义行为:C标准并没有允许主动调用main函数,这种写法依赖编译器实现,兼容性差,同时递归会额外占用栈空间,不是实现循环逻辑的合理方案,应该用循环结构替代。
修复方案
- 读取用户选择的字符前,先清空输入缓冲区的残留空白符,可以在
scanf("%c", &q)的格式符前加一个空格,即scanf(" %c", &q),空格会让scanf自动跳过所有前置空白符,就能正常读取用户输入的y/n了。 - 把整个业务逻辑放到
while(1)死循环里,当用户输入非y的选项时直接break跳出循环结束程序即可,不需要调用main。 - 额外补充优化:增加非法选项的判断逻辑,避免用户输入1-4之外的选项没有任何提示;除法运算增加除数为0的判断,避免除零错误。
修复后的完整代码
#include <stdio.h> int main() { float a, b; int p; char q; while(1) { // 用循环实现重复执行 printf("Enter the first number:"); scanf("%f", &a); printf("Enter the second number:"); scanf("%f", &b); printf("Choose the option:\n1.Sum\n2.Subtraction\n3.Multiplication\n4.Division\nyour choice="); scanf("%d", &p); switch (p) { case 1: printf("The sum of above numbers is: %f", a + b); break; case 2: printf("The subtraction of above numbers is:%f", a - b); break; case 3: printf("The multiplication of above numbers is:%f", a * b); break; case 4: if(b == 0) { printf("Error: divisor cannot be 0"); } else { printf("The division of above numbers is:%f", a / b); } break; default: printf("Error: invalid option"); break; } printf("\n\nDo u want to continue:(y for yes and n for no) :"); // 格式符前加空格跳过缓冲区残留的空白符 scanf(" %c", &q); if (q != 'y') { break; } } return 0; }
内容的提问来源于stack exchange,提问作者how is this
相关产品推荐
相关产品推荐

