C语言switch语句运算符匹配失效,每次触发default分支求助
解决你的四则运算代码问题
嘿,我一眼就揪出问题所在啦,咱们一步步把它修好~
核心问题分析
你的代码每次走default分支,是两个小细节出错导致的:
- 运算符读取的格式符错误:你用了
%s来读单个字符op,但%s是用来读取字符串的,这不仅会造成内存越界(op只有1字节空间),还根本读不到你输入的单个运算符。 - 输入缓冲区的换行残留:前面用
scanf("%d")读取数字时,你按下的回车键会留下一个换行符在输入缓冲区里。当你紧接着读运算符时,scanf会直接把这个换行符读进op,而不是你输入的+或-,这就导致switch匹配不到任何case,只能走default。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { int a; int b; char op; printf("Enter first number: "); scanf("%d", &a ); printf("Enter second number: "); scanf("%d", &b ); printf("Enter the operator: "); // 关键修改:用%c格式符,前面加空格跳过空白,同时传递op的地址 scanf(" %c", &op ); // 可以加这句调试,确认读到的运算符是不是你输入的内容 // printf("Debug: 读取到的运算符是 '%c'\n", op); switch(op) { case '+': printf("Sum is %d", a+b ); break; case '-': printf("Difference is %d", a-b ); break; default: printf("Invalid operator!"); break; } return 0; }
关键修改说明
- 把
scanf("%s", op );改成scanf(" %c", &op );:%c是专门读取单个字符的格式符,匹配char类型变量。%c前面的空格非常关键,它会自动跳过输入缓冲区里的所有空白字符(换行、空格、制表符),确保读到的是你手动输入的运算符。- 必须传
&op而不是op,因为scanf需要变量的地址才能写入值。
小调试技巧
以后遇到类似输入异常的问题,可以在读取变量后加一句打印,看看实际读到的值是什么,这样能快速定位问题~
内容的提问来源于stack exchange,提问作者Sameer Yadav
相关产品推荐
相关产品推荐

