C语言用函数与switch实现计算器,输出前出现多余sss字符求助
问题分析与解决
一、"sss"出现的成因
- 你在
divideTwoNumbers、multTwoNumbers、powerTwoNumbers三个函数中都写了printf("s");,且在main函数里无论用户选择哪种操作,都会提前调用所有运算函数:
所以不管选加法还是其他操作,这三个函数都会先执行,输出三个"s",也就是你看到的前缀"sss"。add=addTwoNumbers(num1, num2); subt=subtTwoNumbers(num1, num2); div=divideTwoNumbers(num1, num2); // 执行时输出第一个"s" mult=multTwoNumbers(num1, num2); // 执行时输出第二个"s" pow=powerTwoNumbers(num1, num2); // 执行时输出第三个"s" - 另外这三个函数声明为返回float类型,但函数内没有return语句,会触发未定义行为,可能导致程序出现更多异常。
二、解决步骤
- 移除不必要的提前调用:只在switch对应的case分支里调用需要的运算函数,而非一开始就调用所有函数。
- 修正运算函数实现:删除错误的
printf("s");,补全每个函数的计算逻辑,确保正确返回结果。 - 修复printf参数错误:当前switch里的printf没有传入计算后的结果,需补充对应变量作为参数。
- 修正
addTwoNumbers语法错误:return float;是非法写法,应返回num1 + num2。 - 补全case 4的break:当前case 4缺少break,会导致执行完乘法后继续执行case 5的代码。
三、修正后的完整代码
#include <stdio.h> #include <math.h> float addTwoNumbers(float num1, float num2); float subtTwoNumbers(float num1, float num2); float divideTwoNumbers(float num1, float num2); float multTwoNumbers(float num1, float num2); float powerTwoNumbers(float num1, float num2); int main() { float num1, num2, result; int choice; printf("choose one operation:\n 1.addition\n 2.substraction\n 3.division\n 4.multiplication\n 5.power\n"); scanf("%d", &choice); printf("Enter two numbers: "); scanf("%f %f", &num1, &num2); switch (choice) { case 1: result = addTwoNumbers(num1, num2); printf("%f + %f = %f\n", num1, num2, result); break; case 2: result = subtTwoNumbers(num1, num2); printf("%f - %f = %f\n", num1, num2, result); break; case 3: if (num2 == 0) { printf("Error: Division by zero!\n"); break; } result = divideTwoNumbers(num1, num2); printf("%f / %f = %f\n", num1, num2, result); break; case 4: result = multTwoNumbers(num1, num2); printf("%f * %f = %f\n", num1, num2, result); break; case 5: result = powerTwoNumbers(num1, num2); printf("%f ^ %f = %f\n", num1, num2, result); break; default: printf("Error! Invalid operation choice.\n"); } return 0; } float addTwoNumbers(float num1, float num2) { return num1 + num2; } float subtTwoNumbers(float num1, float num2) { return num1 - num2; } float divideTwoNumbers(float num1, float num2) { return num1 / num2; } float multTwoNumbers(float num1, float num2) { return num1 * num2; } float powerTwoNumbers(float num1, float num2) { return pow(num1, num2); // 使用math.h库函数实现幂运算 }
四、额外优化说明
- 新增除数为0的判断,避免除法运算崩溃。
- 用单个
result变量统一存储运算结果,减少冗余变量声明。 - 修正case分支的逻辑串位问题,确保每个分支执行后正常退出。
内容的提问来源于stack exchange,提问作者Dilara Aydogmus
相关产品推荐
相关产品推荐

