c新手吧 关注:8,591贴子:48,089
  • 19回复贴,共1

关于两个scanf()问题的新发现

只看楼主收藏回复

#include<stdio.h>
int main()
{
int i,j;
char a,b;
i=scanf("%d",&a);
j=scanf("%d",&b);
printf("a=%d,b=%d,i=%d,j=%d",a,b,i,j);
return 0;
}
/*
在手机C4上,运行如下:
---------------------
23
46
a=0,b=46,i=1,j=1
---------------------
由i=1看出,a有被赋值,但传值有问题,本人试了N多次,a值要么为0,要么就什么都不输出。
有大神来看看吗?
*/


IP属地:安徽来自Android客户端1楼2016-08-18 10:12回复
    电脑上也试过多次,notepad+++gcc环境,同样如此


    IP属地:安徽来自Android客户端2楼2016-08-18 10:14
    回复
      首先。
      scanf的输入格式有问题。
      我想没人会在工程项目里闲到蛋疼写这种的代码。
      不过既然写了,那么就给你分析一下哪里出了“错“。
      在此声明:x是未知地址,%d是十进制格式符(可联想到int,操纵4个字节);
      由于地址相连的关系所以。
      例如: &x &x &x &a &b
      10111101 10111101 10111101 10111101 10111101
      由于你使用了%d,输入a=23,它变成这样。
      &x &x &x &a &b
      00000000 00000000 00000000 00010111 10111101
      你再次使用了%d,输入b=46,它变成。
      &x &x &x &a &b
      00000000 00000000 00000000 00000000 00101110
      这就是a为什么是0的原因。而b却能得到正确的数字。
      所以你可以在输入b的时候,输入一个超大值,试试是否影响到了a。


      IP属地:广东5楼2016-08-18 18:26
      收起回复
        其实我发现这个是因为想解决缓冲区残留字符的问题,在网上查了些方法,正好看到篇关于两个scanf()的问题博文,试了上面的第一个例子,就发现了这个bug


        IP属地:安徽来自Android客户端6楼2016-08-18 20:58
        回复
          IP属地:安徽7楼2016-08-18 21:23
          回复