【发布时间】:2020-02-22 16:29:48
【问题描述】:
可以选择将长度修饰符作为参数合并到scanf() 或其家族成员之一的语句中。
为什么我应该在语句中准确地实现一个长度修饰符,无论我是否已经将分配变量声明为,例如 long int,正确与否?
我完全不明白为什么我应该这样做,并且在包含它和不使用长度修饰符的情况下没有看到输出有任何区别。
例如%2ld里面的l(ell):
long int i;
fscanf(stdin,"%2ld",&i);
我了解长度修饰符是什么,但不了解实现它的原因。
我对它进行了一些研究,即使是在 C99 中,但找不到任何关于它真正详细功能的详细描述。
在此site 上声明:
长度(-修饰符)
hh、h、l、ll、j、z、t、L 之一(可选)。 这会改变相应参数所指向的预期存储类型(见下文)。
这是否意味着长度修饰符改变了分配变量的类型,如果它实际上与转换说明符定义的格式值不匹配?
带有长度修饰符的scanf()到底是做什么的?
有什么好处?
非常感谢您收听。
【问题讨论】:
-
如果预先知道长度,则无需扫描终止空字节。
-
它可以防止类型不匹配,它试图将 32 位填充到一个短整数中。
-
%d 是 UB,它可能对您有用,因为 sizeof(long) == sizeof(int) 在 32 位代码中。在 64 位代码中不一定如此。不要被类型提升弄糊涂了,它让你对 printf() 很草率,指针不会被提升。