可以选择将长度修饰符作为scanf()
或其家族成员的语句的参数。
为什么我要在语句中准确地实现一个长度修饰符,不管我是否已经将赋值变量声明为,例如long int,proper或者not?
我完全不明白为什么要这样做,也看不出包含它和不使用长度修饰符的输出之间有什么区别。
例如,l
内部的%2ld
(ell):
long int i;
fscanf(stdin,"%2ld",&i);
我知道长度修饰符是什么,但不知道实现它的原因是什么。
我做了一些研究,甚至在C99中,但找不到任何详细的描述,它真正做了什么。
在这一点上,声明如下:
长度(-modifier)
h h,h,l,ll,j,z,t,l中的一个(可选)。
这将更改相应参数所指向的存储的预期类型(请参见下文)。
这是否意味着,如果长度修饰符实际上与转换说明符定义的格式值不匹配,则长度修饰符会更改指定变量的类型?
使用长度修饰符
scanf()
到底能做什么?有什么好处?
非常感谢你听我说。
最佳答案
scanf
需要知道它要写入的对象类型。假设在这个C实现中,achar
是一个字节,ashort
是两个字节,aint
是四个字节,along 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
使用length修饰符来知道它正在写入什么类型的对象,以及已经传递给它的指针的类型。