scanf中格式控制和定义的变量格式不一样,为什么会出现这种情况呢?

img


scanf的格式控制是float,但定义的是int,输出这什么是这个数字呢?

img


scanf的格式控制和定义的一样,但是输出不一样,为什么输出的都是0呢?

img


输出和定义的是float,为什么输入是int,于是输出结果就变0了呢?

img


定义的是float,输入输出是整数型,为什么就变0了呢?

img


定义的是整数型,输入输出都是浮点型,为什么就不能正常输出呢?

仅供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    float f;
    double d;
    char bs[65];
    char b[65];
    char s[80];
    unsigned char *p;
    char e[12];
    char *t;
    int ex;
    int flag;

    flag=0;
    while (1) {
        printf("Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:");fflush(stdout);
        rewind(stdin);
        fgets(s,80,stdin);
        if ('\n'==s[0]) return 1;
        if (1==sscanf(s,"0x%16I64X",(__int64 *)&d) && strlen(s)>11) {flag=2;break;}
        if (1==sscanf(s,"0x%8X"    ,(  int   *)&f))                 {flag=1;break;}
        if (1==sscanf(s,"%f"       ,           &f)
         && 1==sscanf(s,"%lf"      ,           &d))                 {flag=3;break;}
    }
    if (flag&1) {
        printf("f=%g\n",f);
        p=(unsigned char *)&f;
        printf("hex=%02X %02X %02X %02X\n",p[3],p[2],p[1],p[0]);
        ltoa(*(long *)&f,b,2);
        sprintf(bs,"%032s",b);
        printf("bin=%s\n",bs);
        printf("bin=%.1s %.8s   %s\n",bs,bs+1,bs+9);
        strncpy(e,bs+1,8);e[8]=0;
        ex=strtol(e,&t,2);
        printf("    %c %-4d-127 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);
        ex-=127;
        printf("    %c %-8d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+9);
    }
    if (flag&2) {
        printf("\nd=%lg\n",d);
        p=(unsigned char *)&d;
        printf("hex=%02X %02X %02X %02X %02X %02X %02X %02X\n",p[7],p[6],p[5],p[4],p[3],p[2],p[1],p[0]);
        _i64toa(*(__int64 *)&d,b,2);
        sprintf(bs,"%064s",b);
        printf("bin=%s\n",bs);
        printf("bin=%.1s %.11s   %s\n",bs,bs+1,bs+12);
        strncpy(e,bs+1,11);e[11]=0;
        ex=strtol(e,&t,2);
        printf("    %c %-6d-1023 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);
        ex-=1023;
        printf("    %c %-11d 1.%s\n",(bs[0]=='0')?'+':'-',ex,bs+12);
    }

    return 0;
}
//Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3FC0000000000000
//
//d=0.125
//hex=3F C0 00 00 00 00 00 00
//bin=0011111111000000000000000000000000000000000000000000000000000000
//bin=0 01111111100   0000000000000000000000000000000000000000000000000000
//    + 1020  -1023 1.0000000000000000000000000000000000000000000000000000
//    + -3          1.0000000000000000000000000000000000000000000000000000
//
//Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0x3E000000
//
//f=0.125
//hex=3E 00 00 00
//bin=00111110000000000000000000000000
//bin=0 01111100   00000000000000000000000
//    + 124 -127 1.00000000000000000000000
//    + -3       1.00000000000000000000000
//
//Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:0.125
//f=0.125
//hex=3E 00 00 00
//bin=00111110000000000000000000000000
//bin=0 01111100   00000000000000000000000
//    + 124 -127 1.00000000000000000000000
//    + -3       1.00000000000000000000000
//
//d=0.125
//hex=3F C0 00 00 00 00 00 00
//bin=0011111111000000000000000000000000000000000000000000000000000000
//bin=0 01111111100   0000000000000000000000000000000000000000000000000000
//    + 1020  -1023 1.0000000000000000000000000000000000000000000000000000
//    + -3          1.0000000000000000000000000000000000000000000000000000
//
//Input a float point number or 0xXXXXXXXX or 0xXXXXXXXXXXXXXXXX:
//


1.c语言比较古老,scanf函数不懂自动判断变量类型,它依赖于你告诉它按什么类型去解析
2.如果你学过c语言基础,就应该知道不论是int还是float,都是二进制存储的,它们的存储方式不一样,具体忘记了可以百度一下,大概了解即可,没必要背。你知道它们到底哪里不一样就能明白为什么会这样了。
这就好比平时我们聊数学的时候^代表多少次方,而代码里^代表异或,不同场合下结果当然不一样了

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7613296
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    当输入的数据类型和定义的变量类型不一致时,会导致scanf函数无法正常读取数据,从而无法正确输出结果。这是因为格式化字符串要求输入的数据应该与变量的数据类型相匹配,如果不匹配就会导致读取失败。举例来说,输入一个浮点数时,需要使用"%f"格式化字符串来读取数据,如果定义的变量类型是整型,就无法正确读取浮点数,导致输出结果为0。

    为了解决这个问题,我们需要根据需要输入的数据类型来选择正确的格式化字符串,并将其作为参数传递给scanf函数。例如,如果要输入一个浮点数,应该使用"%f"格式化字符串,并将指向定义的浮点型变量的指针作为参数传递给scanf函数,代码如下:

    float f;
    printf("请输入一个浮点数:");
    scanf("%f", &f);
    printf("您输入的浮点数为:%f", f);
    

    此外,为了帮助使用者更准确地进行输入,我们可以给出更详细的输入提示,例如提示应该输入什么类型的数据,如何正确输入等。下面是一些常见的输入提示:

    1. 输入整数时,可以输入正数、负数或者0,数字的大小应该在变量类型的范围内,并且不包含小数部分。例如,定义一个整型变量n可以这样输入:
    int n;
    printf("请输入一个整数:");
    scanf("%d", &n);
    printf("您输入的整数为:%d", n);
    
    1. 输入浮点数时,可以输入正数、负数或者0,数字的大小应该在变量类型的范围内,可以包含小数点,小数点后的位数应该匹配。例如,定义一个浮点型变量f可以这样输入:
    float f;
    printf("请输入一个浮点数:");
    scanf("%f", &f);
    printf("您输入的浮点数为:%f", f);
    
    1. 输入字符时,可以输入任意一个字符,包括空格和换行符等。例如,定义一个字符型变量c可以这样输入:
    char c;
    printf("请输入一个字符:");
    scanf("%c", &c);
    printf("您输入的字符为:%c", c);
    
    1. 输入字符串时,可以输入任意长度的字符串,换行符会被包含在字符串内部,所以在读取之前需要清空缓存区。例如,定义一个字符串型变量str可以这样输入:
    char str[100];
    printf("请输入一个字符串:");
    fflush(stdin); //清空缓存区
    gets(str);
    printf("您输入的字符串为:%s", str);
    

    总之,在输入变量时需要选择正确的格式化字符串,并根据实际需要进行输入提示,这样才能保证程序正确输入数据并得到正确的输出结果。