关于scanf两个字符串夹单个字符

刚接触c没多久,有点菜
一个十六进制运算的题目,一到判断ch是加还是减就出问题,我想可能是输入的原因,我就想试一下输入两个字符串一个字符然后原样输出,但是一直不行,不知道哪里出问题了

img


运行的时候,输入完两个字符串一个字符,回车还是不能出结果,一定要再输一个数

img


这是为什么呀,求解惑

因为scanf函数读取字符串后,如果输入的第一个字符串后面有换行,则执行%s获取一个字符串到s1数组中后会把这个换行符丢弃在缓冲区,而被%c读取到字符变量ch中,然后%s获取字符串一定是要遇到第一个非空白字符才会读取成功,所以还需要字符才能执行完第二个%s;

下面的修改,简单实现输入以空白字符分隔两个要参与运算的十六进制数字字符串,以及一个表明运算类的的字符,输出这三个输入对应的运算的十进制结果,修改如下:

参考链接:


https://m.runoob.com/cprogramming/c-function-isspace.html

https://blog.csdn.net/weixin_44788542/article/details/118606443

https://www.runoob.com/cprogramming/c-function-strtol.html

https://blog.csdn.net/weixin_42979760/article/details/125590028

#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;
}
 

img

你这样输入,别说编译器不知道你想干什么,你换谁来谁都不知道你到底想输入个什么呀
要么你写%d%c%d,这肯定没毛病
如果你写%s,那么遇到空格、换行、制表符的时候它就会截断,加号也是字符,也可以作为字符串的一部分,你这整个都被当做一个字符串读入了

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^