为什么第一个代码无法将总和存储在字符中,但第二个代码存储它;当我扫描不同的值时发生了什么?

问题描述 投票:0回答:2

我有这个工作代码,它为一些

unsigned char
变量分配固定值:

#include <stdio.h>
#include <stdlib.h>


int main2() 

{   
 unsigned char a,b;
    a=1,b=2;
    a=(a+b)/2;
    printf("\nAverage: %d\n%18d",a,sizeof(a));  

return 0;
}

但是当我尝试读取值时,就像这样:

#include <stdio.h>
#include <stdlib.h>


int main() 

{   
 unsigned char a,b;
    scanf(" %d", &a);   scanf(" %d", &b);
    a=a,
    b=b,
    a=(a+b)/2;
    printf("\nAverage: %d\n%18d",a,sizeof(a));  

return 0;
}

没用。为什么不?当我打印总和时,

scanf
似乎只取最后一个值。

这是我修复代码的最佳尝试:

#include <stdio.h>
#include <stdlib.h>


int main()
{
unsigned char b;
unsigned short int a;
    scanf(" %u", &a);
    scanf(" %u", &b);
    b=b;{

    b=(a+b);
unsigned short int a;
    scanf(" %u", &a);{  
    
    
    b=(a+b)/3;
    printf("\nAverage: %u",b);  
    printf("\n   sizeof: %d",sizeof(b));
    
    
    }
            
}
return 0;   
}
c scanf undefined-behavior conversion-specifier
2个回答
1
投票

一般建议:编译时牢记警告。复制和粘贴你的代码给了我以下内容:

main.c:8:14: 警告:格式“%d”需要类型为“int *”的参数,但参数 2 的类型为“unsigned char *”[-Wformat=] 8 | scanf(" %d", &a);

所以考虑到所有警告,我可以将你的第一个程序重新排序到这个(有效!):

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a, b;
    scanf(" %d", &a);
    scanf(" %d", &b);
    // a = a, --> has no effect
    // b = b, --> has no effect
    a = (a + b) / 2;
    printf("\nAverage: %d\n%18d", a, sizeof(a));
    return 0;
}

如果你真的想使用无符号字符,请使用 %hhu:

unsigned char a, b;
scanf(" %hhu", &a);
scanf(" %hhu", &b);

1
投票

来自C标准(7.21.6.2的

fscanf
函数)

13 如果转换规范无效,则行为是 未定义。

并且您对声明的对象使用无效的转换说明符,例如:

unsigned char a,b;
scanf(" %d", &a);   scanf(" %d", &b);

转换说明符 d 旨在处理

int
类型的对象,而不是
unsigned char
.

类型的对象

相反,你需要写:

unsigned char a,b;
scanf(" %hhu", &a);   scanf(" %hhu", &b);

或代替:

unsigned short int a;
scanf(" %u", &a);{  

你需要写:

unsigned short int a;
scanf(" %hu", &a);{  

此外,

sizeof
运算符返回类型
size_t
的值。因此,要输出此类值,您需要使用转换说明符
zu
而不是
d
:

printf("\nAverage: %d\n%18zu\n",a,sizeof(a)); 

或者例如:

printf("\n   sizeof: %zu\n",sizeof(b));
© www.soinside.com 2019 - 2024. All rights reserved.