-1

scanf我对C 中的转换说明符有疑问。

#include <stdio.h>

int main(void)
{
    int num1;
    scanf("%hhd",&num1);
    printf("%d \n",num1);
}

由于我"%hhd"在函数中输入了转换说明符scanf,因此当我的输入为“128”时,我希望 -128 存储在num1. 但结果显示 128 存储在num1.

即使我曾经"%hhd"将输入指定为,为什么会发生这种情况char int

4

1 回答 1

2

步骤 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,为什么会发生这种情况?

这与整数类型无关:intchar. 这是关于指针:int *signed char *. "%hhd"inscanf()匹配一个指针:(signed char *unsigned char *or char *),而不是一个intnor 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);
}
于 2016-07-22T13:08:35.777 回答