刚接触c没多久,有点菜
一个十六进制运算的题目,一到判断ch是加还是减就出问题,我想可能是输入的原因,我就想试一下输入两个字符串一个字符然后原样输出,但是一直不行,不知道哪里出问题了
运行的时候,输入完两个字符串一个字符,回车还是不能出结果,一定要再输一个数
这是为什么呀,求解惑
刚接触c没多久,有点菜
一个十六进制运算的题目,一到判断ch是加还是减就出问题,我想可能是输入的原因,我就想试一下输入两个字符串一个字符然后原样输出,但是一直不行,不知道哪里出问题了
因为scanf函数读取字符串后,如果输入的第一个字符串后面有换行,则执行%s获取一个字符串到s1数组中后会把这个换行符丢弃在缓冲区,而被%c读取到字符变量ch中,然后%s获取字符串一定是要遇到第一个非空白字符才会读取成功,所以还需要字符才能执行完第二个%s;
下面的修改,简单实现输入以空白字符分隔两个要参与运算的十六进制数字字符串,以及一个表明运算类的的字符,输出这三个输入对应的运算的十进制结果,修改如下:
参考链接:
#include <stdio.h>
#include <ctype.h> // isspace()
#include <stdlib.h> // strtol()
int main(void){
int t;
scanf("%d",&t);
for(int i=0;i<t;i++){
char ch,s1[31]={0},s2[31]={0};
long a,b;
int z,h;
// https://blog.csdn.net/weixin_45767431/article/details/127714809
scanf("%s",s1); // 获取第一个十六进制字符串
// https://m.runoob.com/cprogramming/c-function-isspace.html
while(isspace((ch=getchar()))!=0){ // 获取一个表示运算类型的字符
continue;
}
scanf("%s",s2); // 获取第二个十六进制字符串
// https://blog.csdn.net/weixin_44788542/article/details/118606443
// https://www.runoob.com/cprogramming/c-function-strtol.html
char * endp;
a = strtol(s1,&endp,16); // 把第一个十六进制字符串转为对应的十进制
b = strtol(s2,&endp,16); // 把第二个十六进制字符串转为对应的十进制
// 根据运算符来计算和打印其对应的十进制结果
if(ch=='+'){
// https://blog.csdn.net/weixin_42979760/article/details/125590028
printf("%s+%s=%ld\n",s1,s2,a+b);
}else if(ch=='-'){
printf("%s-%s=%ld\n",s1,s2,a-b);
}else if(ch=='*'){
printf("%s*%s=%ld\n",s1,s2,a*b);
}else if(ch=='/'){
printf("%s/%s=%.2f\n",s1,s2,a*1.0/b);
}
}
return 0;
}