关于C中scanf的转换说明符
About conversion specifier of scanf in C
我对 C 中 scanf
的转换说明符有疑问。
#include <stdio.h>
int main(void)
{
int num1;
scanf("%hhd",&num1);
printf("%d \n",num1);
}
由于我在 scanf
函数中输入了 "%hhd"
作为转换说明符,所以当我输入“128”时,我希望 -128 存储在 num1
中。但是结果显示128存储在num1
.
即使我使用 "%hhd"
将输入指定为 char int
,为什么会发生这种情况?
第 1 步有 scanf()
个问题:检查结果。除非 return 值表示某些内容已写入 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=]
Why does this happen even though I have used "%hhd"
to specify input as char int?
这与整数类型无关:int
与 char
。这是关于指针的:int *
与 signed char *
。 scanf()
中的 "%hhd"
匹配指针:signed char *
(或 unsigned char *
或 char *
),而不是 int
或 char
。
代码通过 &num1
,一个 int *
。合规代码将传递 signed char *
.
If a conversion specification is invalid, the behavior is undefined. 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);
}
我对 C 中 scanf
的转换说明符有疑问。
#include <stdio.h>
int main(void)
{
int num1;
scanf("%hhd",&num1);
printf("%d \n",num1);
}
由于我在 scanf
函数中输入了 "%hhd"
作为转换说明符,所以当我输入“128”时,我希望 -128 存储在 num1
中。但是结果显示128存储在num1
.
即使我使用 "%hhd"
将输入指定为 char int
,为什么会发生这种情况?
第 1 步有 scanf()
个问题:检查结果。除非 return 值表示某些内容已写入 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=]
Why does this happen even though I have used
"%hhd"
to specify input as char int?
这与整数类型无关:int
与 char
。这是关于指针的:int *
与 signed char *
。 scanf()
中的 "%hhd"
匹配指针:signed char *
(或 unsigned char *
或 char *
),而不是 int
或 char
。
代码通过 &num1
,一个 int *
。合规代码将传递 signed char *
.
If a conversion specification is invalid, the behavior is undefined. 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);
}