| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2346 人关注过本帖
标题:这程序那里错误了,帮找找?
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 50楼 TonyDeng
scanf的工作方式你不用跟我讲,我懂,至于你得到负数那是应因为你没有赋初值;

My life is brilliant
2011-07-31 22:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
赋不赋初值都一样,人家输入a=0,b=5,你程序回馈说不能这样,那就是绝对的荒唐。你就不许真的输入负数啊?自己先解释一下,怎样的数才是不能比较大小关系的?赋了初值又如何?输入a=0,b=0,你说无法比较,出错、退出?

[ 本帖最后由 TonyDeng 于 2011-7-31 22:18 编辑 ]

授人以渔,不授人以鱼。
2011-07-31 22:15
风生钧起
Rank: 4
来 自:江西
等 级:业余侠客
帖 子:383
专家分:246
注 册:2011-7-26
收藏
得分:0 
回复 50楼 TonyDeng
scanf()函数的机制,是从控制台读入一个字符串(注意,是字符串),然后对这个字符串进行分析,按照预定的format格式提取数据。  这句话我看不懂 是不是 不是字符串 就不会出现问题?

墨一世红颜倾醉己    霁天谁与话风流

修仙``````````````````````````````````````````````
2011-07-31 22:16
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 53楼 风生钧起
程序代码:
#include <assert.h>
int main(void) {
    int a, b;
    assert(scanf("%d, %d", &a, &b) == 2);
    return 0;
}

My life is brilliant
2011-07-31 22:27
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 52楼 TonyDeng
程序代码:
#include <assert.h>
int main(void) {
    int a, b;
    assert(scanf("%d, %d", &a, &b) == 2);
    return 0;
}

My life is brilliant
2011-07-31 22:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用风生钧起在2011-7-31 22:16:30的发言:

scanf()函数的机制,是从控制台读入一个字符串(注意,是字符串),然后对这个字符串进行分析,按照预定的format格式提取数据。  这句话我看不懂 是不是 不是字符串 就不会出现问题?


在计算机内部,任何数据都是从字符串转换出来的。这就是C语言教程一开始提示我们char其实是int的原因。计算机内部,所有数据都是二进制数,解释成什么数据类型,那是人为规定的,比如,你说32是十进制整数,固然没错,但它也可以被解释成是ASCII码的空格。scanf()先读入的一连串数据,是作为字符串处理的,所以它以最后为0结束作标志,一旦它遇到0,就认为数据输入结束了(从控制台很容易输入0的,按住Alt在小键盘上敲000就是)。如果得到的数据串是48,00,当你scanf("%s")时,它就将48解释成字符串"0"(两个字节的字符串),如果是scanf("%d"),它就解释成48。也就是说,总是从整数数组{48,00}中解释数据(比如这是两个整数,48和0)。

所谓从控制台通过键盘输入数据,其实是按键时在键盘缓冲区中键入了键的代码,比如按空格键,就记录下32,诸如此类。scanf()函数,就从键盘缓冲区中提取这些数据,所以,你按空格,它得到32,你按1,它得到49(不是1)。

你记得这里有个人问的问题吗?他的程序有个菜单,用switch语句比较选择,就比较错了:键盘按的是字符'1',而他switch中是case 1,所以不对。但是,你输入数字1也得按这个键不是?程序怎么分辨呢?所以,scanf()必须有格式参数(也有人问过这个问题)。

[ 本帖最后由 TonyDeng 于 2011-7-31 22:50 编辑 ]

授人以渔,不授人以鱼。
2011-07-31 22:29
风生钧起
Rank: 4
来 自:江西
等 级:业余侠客
帖 子:383
专家分:246
注 册:2011-7-26
收藏
得分:0 
回复 56楼 TonyDeng
怎么我 数据是这样的
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


ZP06BEM}50W2BXX7T@`YNNS.jpg (10.96 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

墨一世红颜倾醉己    霁天谁与话风流

修仙``````````````````````````````````````````````
2011-07-31 22:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf()有什么隐患呢?最严重的隐患是如下这种情形:

程序代码:
int a, b, c; 

scanf("%d,%d", &a, &b);
printf("a = %d, b = %d\n", a, b);
scanf("%d", &c);
printf("c = %d\n", c);


在第一次scanf()的时候,你输入12,34,56看看后果。

授人以渔,不授人以鱼。
2011-07-31 23:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 57楼 风生钧起
你写的什么呀?

授人以渔,不授人以鱼。
2011-07-31 23:03
风生钧起
Rank: 4
来 自:江西
等 级:业余侠客
帖 子:383
专家分:246
注 册:2011-7-26
收藏
得分:0 
回复 58楼 TonyDeng
不管12 还是1 2 b都是垃圾值 也就是说scanf怎么说呢 它把还在读取的数 给 b了,我是这样想的。

墨一世红颜倾醉己    霁天谁与话风流

修仙``````````````````````````````````````````````
2011-07-31 23:12
快速回复:这程序那里错误了,帮找找?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037840 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved