我对C中的scanf
转换说明符有疑问。
#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
,也会发生这种情况?
答案 0 :(得分:2)
第1步出现<!DOCTYPE html>
<style>
.con {
display: flex;
flex-flow: row;
align-items: stretch;
}
.s-con {
display: flex;
flex: 1 auto;
border: 1px solid black;
align-items: stretch;
flex-flow: column;
}
.foot {
background-color: red;
}
.stretch {
background-color: blue;
flex: 2;
margin: 0;
}
</style>
<div class="con">
<div class='s-con'>
<ul class='stretch'>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>d</li>
<li>d</li>
<li>d</li>
</ul>
<div class='list-header'>
heading1
</div>
</div>
<div class='s-con'>
<ul class='stretch' style="overflow: hidden; overflow-y: auto;">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>3</li>
<li>4</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>1</li>
<li>2</li>
</ul>
<div class='foot'>
heading2
</div>
</div>
问题:检查结果。除非返回值表示已将某些内容写入scanf()
,否则打印它不会反映用户输入。
num1
第2步:启用编译器警告。节省时间。
int num1;
if (scanf("%hhd",&num1) == 1) {
printf("%d \n",num1);
}
为什么即使我使用
也会发生这种情况if (scanf("%hhd",&num1) == 1) { // warning: format '%hhd' expects argument of type 'signed char *', // but argument 2 has type 'int *' [-Wformat=]
将输入指定为char int?
这与整数类型无关:"%hhd"
与int
。关于指针:char
与int *
。 signed char *
中的"%hhd"
匹配指针:scanf()
(或signed char *
或unsigned char *
),而不是char *
或int
。< / p>
代码已通过char
,&num1
。合规代码将传递int *
。
如果转换规范无效,则行为未定义。 C11§7.21.6.213
就是这样。代码违反规则,预期行为不会发生。使用正确的类型。
signed char *
如果代码必须将结果保存在signed char num1;
if (scanf("%hhd",&num1) == 1) {
printf("%d \n",num1);
}
:
int