c++ - 为什么我应该在 scanf() 系列成员中加入一个长度修饰符作为参数?有什么好处?带有长度修饰符的 scanf 有什么作用?

标签 c++ c scanf modifier

可以选择将长度修饰符作为 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 代表一个 intD 代表一个 long intS 代表一个short int,等等。或者我们可以制作其他代码。很简单,我们选择的代码使用dinthdshort intld long int,所以没有。

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

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

关于c++ - 为什么我应该在 scanf() 系列成员中加入一个长度修饰符作为参数?有什么好处?带有长度修饰符的 scanf 有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58573447/

相关文章:

c++ - 预处理在编译器中究竟意味着什么

c++ - matlab与c语言dll的连接

c++ - 可变参数模板与使用元组在参数中添加不同的数据对

c - 弹出堆栈的唯一成员

c - 使用 fscanf() 从两列文件中获取两个值

c++ - 在析构函数 : Invalid address specified to RtlValidateHeap 中使用 delete[]

c++ - 无法停止来自 python C 扩展的 python 回调

c - 如何正确使用 SO_RXQ_OVFL 检测 Linux 套接字上的 UDP 溢出?

php - 如何使用 fscanf 读取整行(字符串)?

string - 使用 sscanf 扫描日期