永发信息网

scanf()函数格式控制符(%d、%f、%c...)和地址指针(&)及输入数据,它们的真正内涵是?

答案:4  悬赏:40  手机版
解决时间 2021-02-15 01:55
  • 提问者网友:原来太熟悉了会陌生
  • 2021-02-14 15:18
假定int 2字节 float 4字节 double 8字节。

格式控制符指输入将被转换成的格式,&为指向变量的指针。

1. 输入类型长度不同?
int a;

scanf("%d",&a);
如果输入的整数在-32768~32767之外就会错误。

2. 定义的变量类型和scanf()格式说明符类型不一致
int a;

scanf("%f",&a);

float b;

scanf("%d",&b);

3. 定义变量类型长度和scanf()格式说明符类型长度不一致
double a;

scanf("%f",&a);

这3种情况都是错误的,错误的根本原因是什么?我们从键盘输入的数据,它自身的类型和长度与格式控制符(%d,%f...)有什么关系,而格式控制符(%d,%f...)的类型和长度与地址指针(&)又有什么关系?
最佳答案
  • 五星知识达人网友:玩家
  • 2021-02-14 16:00
本质原因在于 scanf 后面的参数是 ... 这种不定类型的,
因此scanf不知道这些变量的实际类型,需要额外告诉它,而%d %f就是来做这个事情.
scanf在拿到这些变量后,会根据前面的%d %f做强制类型转换,然后处理,

如果%d %f和实际定义的变量不一致,scanf就会做错误的类型转换,最后自然得到错误的结果.

对于 &a, 是因为C/C++的函数的参数是传值的,也就是说如果直接传a给scanf, 它是没办法修改a的值的, 为了让scanf能够根据输入修改a的值, 必须传a的地址, 就是 &a
全部回答
  • 1楼网友:洎扰庸人
  • 2021-02-14 17:55
定义类型如:int a,实际上就是给a分配栈空间,在计算机中任何数据都是以01格式存储在存储介质中。这里所用的介质当然是内存条。int a和 char a在电脑看来没什么不一样,就是长度的问题,编译的时候这两者混用可以通过,大不了就是一个截断问题,但是int和浮点类型就不一样了,比如float类型,它的内存里的数据,一部分代表正负,一部分代表指数....。“&”是取地址,比如&a,就是取前面int a时,系统为a分配的那个栈地址,这是scanf()函数的实现方法决定的,(有兴趣可以看一下库函数里的源代码),它和格式控制符没有关系,如果你不用&会有什么后果?答案是:很严重,因为你访问了一个不可预知的地址(a的值,没有初始化就是一个随机值),轻则程序崩溃,严重的会影响系统(但是一般系统都是有内存保护的,外部一般没有访问权限)。建议楼主看一下各种数据类型的内存结构,以及系统为一个程序分配的空间:常量区、堆栈区.......
  • 2楼网友:逐風
  • 2021-02-14 16:53
1) 在16位的CPU中,整数是用两个字节,也就是16个二进制位表示的, 用补码表示的话, 范围就是-32768到32767. 所以,当你输入的数据超出这个范围时, 内部将无法正确表示这个数. 此时具体结果如何,和编译器产品的设计有关.总之, 不会有正确结果出现. 在日常生活中,如果一个本子上只有两个格,你就无法往里写三位数. 只是,具体int是两个字节还是四个字节或更多字节,不仅取决于CPU,还和编译器有关, 2) 浮点数有特殊的表示格式, 这个格式是有国际标准的. 和整数的格式完全不同.比如, 数字2.0的标准内部4字节表示为 0x00 0x00 0x00 0x40. 程序语句scanf("%d", &b)编译后在执行时, CPU把输入的字符串, 比如"2",按其中"%d"的指示转换成整数,也就是0x02 0x00, 而正确的结果应该是在b的位置存入0x00 0x00 0x00 0x40,因此当使用变量b时, 按最初变量定义, 它是浮点数,用浮点数的计算方法, 这样, 以后b不论显示还是参与计算都是错的.这里不光是数据错误,由于不同变量内部表示长度不同,scanf("%f", &a), 转换结果时, 还会影响到变量a后面的空间的数值.导致更复杂的结果. 3) double 的内部长度多于4个字节,在scanf中误用格式串也存在 2)中所述问题.
  • 3楼网友:十年萤火照君眠
  • 2021-02-14 16:48
首先操作系统会将你的输入当成字符串先做一个缓存,无论你输入的是什么; 然后启动相应的转换程序,将你的字符串转换成你的格式符修饰的类型的数据,这个转换是机械的,不做过多的判断。那么如果这部出错(比如%d时你输入大于int型数据范围的数)由编程者和输入者负责(可以通过更好的程序设计或通过详细的提示避免)。 转换完成后的数据(按照你指定的类型)由操作系统存放到你后面的指针中去,不判断指针是否与数据类型是否匹配,这步如果不匹配将会导致意外问题。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯