使用scanf()中的格式说明符在C中输入



我可以成功地执行下面的代码块,但无法从逻辑上理解代码的输出。

#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

查询:

  1. 为什么没有打印类型字符串的参数/输入
  2. 变量"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中,未被触及。我想剩下的都给你了。

最新更新