我想知道当转换说明符为%d
时,C中的scanf如何将字符串输入识别为int。例如,
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
printf("%d n",x);
}
当我的输入是123456时,scanf如何将此字符串解释为整数?此外,当scanf中的转换说明符是%hd
和%d
时,识别输入字符串有什么区别?
scanf()
扫描格式字符串并从stdin
读取字节,以尝试匹配格式字符串中指定的预期序列。%d
的格式命令scanf()
读取字节并根据十进制表示计算int
的值。为此,它遵循以下步骤:
- 首先读取并丢弃与
isspace()
匹配的任何字节:' '
、't'
、'r'
、'n'
、'v'
、'f'
以及可能的一些其他值 - 然后读取一个可选符号:CCD_ 16或CCD_。将初始值设置为CCD_ 18
- 然后重复读取与数字CCD_ 19至CCD_。计算由这些数字表示的值:对于每个数字,将迄今为止计算的值相乘,并将该数字的值
c - '0'
(ASCII)相加 - 只要读取的字节不是数字,就停止,并用
ungetc(c, stdin);
将该字节推回stdin
如果没有看到数字,请停止扫描过程,并返回到目前为止正确存储的格式数(如果scanf
格式字符串中有多个格式),如果完全不匹配,则返回EOF
。
如果至少看到一个数字,则对计算值应用可选的负号,并将结果存储到作为额外参数传递给scanf()
的指针。如果格式为%hd
,则该指针为short *
,因此在存储之前,该值将转换为short
。
继续扫描格式字符串,直到其结束。
scanf
从stdin读取数据,并根据参数格式将数据存储到附加参数所指向的位置。因此,当您为输入的fotmat写入%d时,它被解释为整数。
%d
代表整数(例如,对于大多数32位系统为4字节)
%hd
代表短整数(整数大小的一半)