我有这个工作代码,它为一些
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;
}
一般建议:编译时牢记警告。复制和粘贴你的代码给了我以下内容:
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);
来自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));