[有机会将长度修饰符作为scanf()
或其一个家庭成员的陈述的参数。
为什么我已经在声明中准确地实现了长度修饰符,无论我是否已经将赋值变量声明为long int,例如正确与否?
我非常不明白为什么我应该这样做,并且在包含它和不使用长度修饰符的情况下在输出上看不出任何区别。
例如,l
内的%2ld
(ell):
long int i;
fscanf(stdin,"%2ld",&i);
我了解长度修饰符是什么,但不知道实施它的原因。
即使在C99中,我也进行了一些研究,但找不到有关其真正详细功能的任何详细描述。
在此site上指出:
长度(-修饰符)
hh,h,l,ll,j,z,t,L中的一个(可选)。这会更改相应参数所指向的预期存储类型(请参见下文)。
这是否意味着,如果长度修饰符实际上与转换说明符定义的格式值不匹配,那么长度修饰符会更改所分配变量的类型吗?
使用长度修饰符的scanf()
到底能做什么?
有什么好处?
非常感谢您倾听。
scanf
需要知道它要写入的对象类型。假设在此C实现中,char
是一个字节,short
是两个字节,int
是四个字节,long int
是八个字节。 scanf
收到的参数是一个指针,但是scanf
知道该指针指向的唯一方法是通过格式字符串。
如果参数指向long int
,则scanf
需要将8个字节写入该位置。如果它指向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
使用长度修饰符既可以知道它正在写入的对象类型,又可以知道将哪种类型的指针传递给它。
编辑: