【发布时间】:2013-08-14 17:55:51
【问题描述】:
从下面的代码sn-p可以看出,我声明了一个char变量和一个int变量。编译代码时,必须识别变量str和i的数据类型。
为什么我需要在扫描我的变量时通过将%s 或%d 指定为scanf 来再次告知它是字符串或整数变量?当我声明我的变量时,编译器还不够成熟,无法识别吗?
#include <stdio.h>
int main ()
{
char str [80];
int i;
printf ("Enter your family name: ");
scanf ("%s",str);
printf ("Enter your age: ");
scanf ("%d",&i);
return 0;
}
【问题讨论】:
-
%x,%d,%s都是“告诉”printf()如何显示数据的格式说明符;即比特流是显示为十六进制数还是十进制整数或 ASCII 表示。数据就是数据就是数据。 :-) 程序员(使用 printf)可以随意解释它。 -
见于浩的回答...问题是printf和scanf是varargs函数,也就是说它们的参数没有静态类型。并且 C 是弱类型的……没有函数可以检查的运行时类型信息;格式服务于这个目的。
-
我对格式说明符的回答怎么样?你认为
stdio.h没有必要像@mvp 先生建议的那样使用scanf()吗? -
虽然 C 语言的限制以及您可以在运行时创建格式字符串的事实意味着对于
printf、scanf和朋友您将始终需要再次指定类型,如果格式字符串是硬编码的,一些编译器至少会为您验证类型是否匹配:gcc.gnu.org/onlinedocs/gcc/… -
这一点是有效的,编译器看不到“%?”并没有真正的原因。 (其中 %? 是编译器扩展)并使用 typeof(next_arg_in_list) 来猜测“?” 应该替换为,使用诸如“0x”之类的上下文来指定十六进制等...
标签: c compiler-construction printf scanf