scanf如何将输入(字符串)识别为整数?

时间:2016-07-24 08:56:10

标签: c scanf

我想知道当转换说明符是%d时,C中的scanf如何识别输入,这是一个字符串,例如,

#include <stdio.h>
int main()
{
    int x;
    scanf("%d",&x);
    printf("%d \n",x);
}

当我的输入是123456时,scanf如何将此字符串解释为整数? 另外,当scanf中的转换说明符为%hd%d时,识别输入字符串之间的区别是什么?

2 个答案:

答案 0 :(得分:2)

scanf从stdin读取数据,并根据参数格式将它们存储到附加参数指向的位置。因此,当您为fotmat写入%d时,输入会将其解释为整数。

%d代表整数(例如,大多数32位系统为4个字节)

%hd代表短整数(整数大小的一半)

答案 1 :(得分:2)

scanf()扫描格式字符串并从stdin读取字节以尝试匹配格式字符串中指定的预期序列。格式%d命令scanf(),用于读取字节并从十进制表示中计算int的值。为此,它遵循以下步骤:

  • 首先阅读并丢弃与isspace()匹配的所有字节:' ''\t''\r''\n''\v',{{1可能还有一些其他值。
  • 然后阅读一个可选的标志:'\f'-。将初始值设置为+
  • 然后重复读取与数字对应的字节:00。计算这些数字所代表的值:对于每个数字,多计算到目前为止计算的值,并为ASCII添加数字9的值。
  • 只要读取的字节不是数字,
  • 就会停止,并使用c - '0'
  • 将此字节推回stdin

如果没有看到数字,请停止扫描过程并返回到目前为止正确存储的格式数(如果ungetc(c, stdin);格式字符串中有多种格式)或scanf完全不匹配。

如果看到至少一个数字,则将可选的负号应用于计算值,并将结果存储到作为EOF的额外参数传递的指针。如果格式为scanf(),则此指针为%hd,因此在存储之前,该值将转换为short *

继续扫描格式字符串直到结束。