为什么我应该在scanf()-family成员中加入长度修饰符作为参数?有什么好处?使用length修饰符的scanf有什么作用?

问题描述 投票:0回答:2

[有机会将长度修饰符作为scanf()或其一个家庭成员的陈述的参数。

为什么我已经在声明中准确地实现了长度修饰符,无论我是否已经将赋值变量声明为long int,例如正确与否?

我非常不明白为什么我应该这样做,并且在包含它和不使用长度修饰符的情况下在输出上看不出任何区别。

例如,l内的%2ld(ell):

long int i;
fscanf(stdin,"%2ld",&i);

我了解长度修饰符是什么,但不知道实施它的原因。

即使在C99中,我也进行了一些研究,但找不到有关其真正详细功能的任何详细描述。

在此site上指出:

长度(-修饰符)

hh,h,l,ll,j,z,t,L中的一个(可选)。这会更改相应参数所指向的预期存储类型(请参见下文)。

这是否意味着,如果长度修饰符实际上与转换说明符定义的格式值不匹配,那么长度修饰符会更改所分配变量的类型吗?

使用长度修饰符的scanf()到底能做什么?

有什么好处?

非常感谢您倾听。

c++ c scanf modifier
2个回答
1
投票

scanf需要知道它要写入的对象类型。假设在此C实现中,char是一个字节,short是两个字节,int是四个字节,long int是八个字节。 scanf收到的参数是一个指针,但是scanf知道该指针指向的唯一方法是通过格式字符串。

如果参数指向long int,则scanf需要将8个字节写入该位置。如果它指向short,则scanf需要在该位置写入两个字节,而不是八个字节。

长度修饰符只是告诉scanf类型的代码的一部分。我们可以编写一个代码,其中d代表intD代表long intS代表short int,依此类推。否则我们可能会制定其他代码。简而言之,我们选择的代码使用d表示inthd表示short intld表示long int,因此没有。

[另一种选择可能是将有关目标类型的信息与有关解析内容的信息分开。 d表示int和“默认读取十进制”。较干净的设计可能有一个用于类型的代码(shortint等)和另一个用于输入格式的代码(十进制,八进制,十六进制等)。

根据指针所指向的事物的类型,指针本身也可能具有不同的表示形式。这在现代C实现中是不常见的,但有可能。因此,scanf使用长度修饰符既可以知道它正在写入的对象类型,又可以知道将哪种类型的指针传递给它。


-1
投票

编辑:

© www.soinside.com 2019 - 2024. All rights reserved.