步骤 1 有scanf()
问题:检查结果。除非返回值表明写入了某些内容,否则num1
打印它不会反映用户输入。
int num1;
if (scanf("%hhd",&num1) == 1) {
printf("%d \n",num1);
}
第 2 步:启用编译器警告。节省时间。
if (scanf("%hhd",&num1) == 1) {
// warning: format '%hhd' expects argument of type 'signed char *',
// but argument 2 has type 'int *' [-Wformat=]
即使我曾经"%hhd"
将输入指定为 char int,为什么会发生这种情况?
这与整数类型无关:int
与char
. 这是关于指针:int *
与signed char *
. "%hhd"
inscanf()
匹配一个指针:(signed char *
或unsigned char *
or char *
),而不是一个int
nor char
。
代码通过&num1
,一个int *
。兼容的代码将通过signed char *
.
如果转换规范无效,则行为未定义。C11 §7.21.6.2 13
这就对了。代码违反了规则,预期的行为不会发生。使用正确的类型。
signed char num1;
if (scanf("%hhd",&num1) == 1) {
printf("%d \n",num1);
}
如果代码必须将结果保存在int
:
int num1;
signed char ch1;
if (scanf("%hhd",&ch1) == 1) {
num1 = ch1;
printf("%d \n",num1);
}