C语言 为什么第一个代码不能将和存储在一个字符中,但第二个存储它;当我扫描不同的值时会发生什么?[关闭]

wztqucjr  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(70)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

12天前关闭。
Improve this question
我有这样一段工作代码,它为一些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;   
}
ehxuflar

ehxuflar1#

来自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));
9bfwbjaz

9bfwbjaz2#

一般建议:在编译的时候要牢记警告。复制和粘贴你的代码给了我以下的好处:
主.c:8:14:警告:格式“%d”需要类型为“int *”的参数,但参数2的类型为“unsigned char *”[-Wformat=] 8|扫描文件(“%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;
}

如果你真的想使用unsigned chars,使用%hhu:

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

相关问题