关于C中scanf的转换说明符

时间:2016-07-22 08:04:06

标签: c scanf format-specifiers length-modifiers

我对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,也会发生这种情况?

1 个答案:

答案 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。关于指针:charint *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