可以选择将长度修饰符作为 scanf()
或其家族成员之一的语句的参数。
为什么我应该在语句中准确地实现一个长度修饰符,无论我是否已经将赋值变量声明为,例如 long int,是否正确?
我完全不明白为什么我应该这样做,并且没有看到包含它和不使用长度修饰符的输出之间有任何区别。
例如%2ld
中的l
(ell):
long int i;
fscanf(stdin,"%2ld",&i);
我理解长度修饰符是什么,但不知道实现它的原因是什么。
我为它做了一些研究,甚至在 C99 中,但找不到任何关于它真正详细作用的详细描述。
在此site声明:
length (-modifier)
One of hh, h, l, ll, j, z, t, L (optional). This alters the expected type of the storage pointed by the corresponding argument (see below).
这是否意味着长度修饰符改变了赋值变量的类型,如果它实际上不匹配用转换说明符定义的格式值?
带有长度修饰符的 scanf()
究竟做了什么?
有什么好处?
非常感谢您收听。
最佳答案
scanf
需要知道它正在写入什么类型的对象。假设,在这个 C 实现中,一个 char
是一个字节,一个 short
是两个字节,一个 int
是四个字节,一个 >long int
是八个字节。 scanf
接收的参数是一个指针,但 scanf
知道该指针指向什么的唯一方法是通过格式字符串。
如果参数指向一个long int
,那么scanf
需要向该位置写入八个字节。如果它指向一个 short
,则 scanf
需要向该位置写入两个字节而不是八个字节。
长度修饰符只是告诉 scanf
类型的代码的一部分。我们可以编写一个代码,其中 d
代表一个 int
,D
代表一个 long int
,S
代表一个short int
,等等。或者我们可以制作其他代码。很简单,我们选择的代码使用d
为int
,hd
为short int
,ld
为 long int
,所以没有。
另一种选择可能是将有关目标类型的信息与有关要解析的内容的信息分开。 d
表示 int
和“默认读取十进制”。更简洁的设计可能有一个代码用于类型(short
、int
等)和另一个代码用于输入格式(十进制、八进制、十六进制等) .
指针本身也可能根据其指向的事物的类型而具有不同的表示形式。这在现代 C 实现中是不常见的,但是是可能的。因此 scanf
使用长度修饰符来了解它正在写入的对象类型以及传递给它的指针类型。
关于c++ - 为什么我应该在 scanf() 系列成员中加入一个长度修饰符作为参数?有什么好处?带有长度修饰符的 scanf 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573447/