我可以成功地执行下面的代码块,但无法从逻辑上理解代码的输出。
#include<stdio.h>
int main()
{
int x,y;
float f;
char text[22];
scanf("%d %2d %f %5s", &x, &y, &f, text);
printf("%d %d %f %s", x,y, f, text);
}
输入:1 3456 5.6 web
输出:1 34 56.0000005.6
查询:
- 为什么没有打印类型字符串的参数/输入
- 变量"y"只读取输入值3456中的2位数字(如格式说明符所述(,但为什么要读取输入3456中未读取的数字(56(并将其存储在float类型的变量f的地址中
代码显示:
- 读取一个整数,这是显而易见的方法
- 专门读取两位数的整数
- 读取浮点值
- 读取字符串的五个字符
输入1 3456 5.6 web
,即作为完成
- 明显整数,读作";1〃
- 两位整数,读作"0";34〃
- 一个浮子,读作";56〃
- 字符串的五个字符,读作";5.6〃
因此,输出应该是(来自foramt字符串的带有混合空格的值,使用双引号来可视化不同的部分(:CCD_ 2。
注:
- 在第一个空格的情况下应该有两个空格,你只报告了一个,坦率地说,我假设你的部分有复制粘贴
- 小数点和零是为输出浮点值的默认格式添加的,我认为它与您的环境相匹配
- ";5.6〃;再次应该有两个前导空格和一个尾随空格,但你没有报告,我再次假设你有复制粘贴错误
- ";web";从未被读取,因为限制为五个字符,其中已经填充了两个空格、两个数字和一个点
理解它的最好方法是将其可视化IMO.
因此,当它提示您输入时,您可以输入1 3456 5.6 web
。想象一下stdin
是这样的:
1 3456 5.6 web
第一个格式说明符是%d
,它只接受一个整数并将其存储到x
中。%d
:之后
3456 5.6 web
x = 1, y = ?, f = ?, text = ?
下一个格式说明符是%2d
;取一个整数,但最大数字为2,之后的任何数字都将保持不变"所以%2d
:之后
56 5.6 web
x = 1, y = 34, f = ?, text = ?
接下来是%f
。非常不言自明,采用float
作为输入。然而,由于56
仍保留在stdin
中,因此它采用56
而不是5.6
作为输入。所以%f
:之后
5.6 web
x = 1, y = 34, f = 56.0f, text = ?
接下来是最后一个,%5s
。它的意思是";输入一个字符串,但输入的字符数不超过5个"但是,它不会读取web
。由于" 5.6 "
仍然位于"1"" ""34"" ""56.000000"" "" 5.6 "
0之前,因此它将使用" 5.6 "
(正好5个字符(作为字符串。所以在%5s
:之后
web
x = 1, y = 34, f = 56.0f, text = " 5.6 "
并且web
保持在stdin
中,未被触及。我想剩下的都给你了。