| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2346 人关注过本帖
标题:这程序那里错误了,帮找找?
只看楼主 加入收藏
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 35楼 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 21:33
风生钧起
Rank: 4
来 自:江西
等 级:业余侠客
帖 子:383
专家分:246
注 册:2011-7-26
收藏
得分:0 
查书 调试 弄了半天 的出结论是 函数确实没出错(实在 是楼主跟我写的一点都不同) scanf的问题


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

修仙``````````````````````````````````````````````
2011-07-31 21:33
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
我不想为一个逗号的问题争论那么久。

My life is brilliant
2011-07-31 21:34
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
回复 40楼 TonyDeng
现在你还想说些什么呢,我代码又有问题了吗?

My life is brilliant
2011-07-31 21:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用lz1091914999在2011-7-31 21:29:08的发言:

我现在都不明白你到底想要表达什么,是认为scanf设计得不够人性化,还是你有本事能写一个比scanf好的扫描函数?


再三地提醒你不懂写实际的能用的程序。我用640K内存PC机写纯英文DOS下的中文信息管理软件的时候,你还不知道C是什么吧?取代这一个函数,是每一个用C写软件的人的首要功夫,没有C高手会用这个函数录入数据的。DOS时代不会,Windows时代更加不会。

谦虚一点还可以教你怎么写实用的程序。关键在设计,不是你会用断言野蛮地中断程序。

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

授人以渔,不授人以鱼。
2011-07-31 21:39
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用风生钧起在2011-7-31 21:33:21的发言:

查书 调试 弄了半天 的出结论是 函数确实没出错(实在 是楼主跟我写的一点都不同) scanf的问题


分开输入数据就能减少一半的问题。不要这样连在一起录入,除非你是从磁盘上的文件中对照固定格式的数据取数据,凡是有人参与的,都不应用这个函数。用gets()读入字符串之后自己分析出正确的数据。这个scanf()函数,你不断地打回车看看有什么后果,谁希望见到这样的程序界面?

授人以渔,不授人以鱼。
2011-07-31 21:43
lz1091914999
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
注 册:2010-11-1
收藏
得分:0 
以下是引用TonyDeng在2011-7-31 21:39:15的发言:

 
 
再三地提醒你不懂写实际的能用的程序。我用640K内存PC机写纯英文DOS下的中文信息管理软件的时候,你还不知道C是什么吧?取代这个一个函数,是每一个用C写软件的人的首要功夫,没有C高手会用这个函数录入数据的。DOS时代不会,Windows时代更加不会。
 
谦虚一点还可以教你怎么写实用的程序。关键在设计,不是你会用断言野蛮地中断程序。
呵,那可能是我的年龄不够吧,scanf录入数据还挺好的啊,freopen("file_name", "r", stdin);这样不就重定向了吗?还可以少在scanf前面写一个f,至于DOS,在我小学时候家庭计算机的OS很多都已经是Windows 98了,我连DOS都没用过。

[ 本帖最后由 lz1091914999 于 2011-7-31 21:52 编辑 ]

My life is brilliant
2011-07-31 21:45
pwy520xiao
Rank: 1
等 级:新手上路
帖 子:11
专家分:3
注 册:2011-7-29
收藏
得分:0 
是的,要输入“,”才能完全的成立。我是菜鸟,还在学习基础的,都是看基础的!
2011-07-31 21:47
风生钧起
Rank: 4
来 自:江西
等 级:业余侠客
帖 子:383
专家分:246
注 册:2011-7-26
收藏
得分:0 
回复 46楼 TonyDeng
哎!  基础没过关 这他,Y的  书上没看懂  去学习去

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

修仙``````````````````````````````````````````````
2011-07-31 21:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 47楼 lz1091914999
对,从文件、内存中读入固定格式的数据,scanf()类函数(那是一个系列版本的函数,有专门读内存的,有专门读文件的,甚至Borland C有专门读屏幕的)能用,但这些都没有人的干预,只有人的动作是无法预料的,从控制台(std)交互读入数据,就要尽量避免用这个函数,因为你无法预料读到什么格式的数据,极有可能转换不到希望得到的数据类型上。

scanf()函数的机制,是从控制台读入一个字符串(注意,是字符串),然后对这个字符串进行分析,按照预定的format格式提取数据。比如,在1楼的程序代码里,期望是%d,%d,那么scanf()在取得第一个整数之后,就不断地寻找逗号,但事实上找不到,已经到达字符串的尽头了,但它还会找,把储存这个字符串的内存后面的东西提出来,这就是那些不可预料的数据,在某些机器上,是负值(至少我和楼主的机器是得到了负数,但其实应是随机的)。这就是这种后果的原因,也是scanf()类函数不管读什么数据,都是从指针(就是那个&符号)上取得数据的原因。

因为我知道(其实很多专门写C的人都知道)scanf()这种读取数据的机制,所以对无法预料格式的数据输入,是绝对避免使用scanf()函数的。必须用读字符串的方法,读进来,再自己分析,该怎么处理自己可以控制,但scanf()是库函数,其动作不是你可以控制的。以前我们专门比较过,只要一使用scanf()、printf()函数,程序的EXE代码就暴涨,可见它里面有多么复杂。我们不用这个东西,除了它有太多不需要用到的功能之外,还为了尽量减省内存。

对1楼这样的程序,良好的设计方式是把两个数据分开来读,一次只读一个数据,就不会出现这样的问题。还有一种办法是限制数据的位数,比如用%02d%02d之类。不过,在程序的界面,都应该向使用者提示推荐的输入格式,否则他不知道应该输入逗号,只有你写程序的才知道。写程序,要站在使用者的角度去看待问题,不是你自己知道内部运作去迁就程序的,真正的使用者,才不会管你这些东西。应用软件的程序设计,有八成功夫花在界面上,这是学写程序的人一定要注意的。

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

授人以渔,不授人以鱼。
2011-07-31 22:03
快速回复:这程序那里错误了,帮找找?
数据加载中...
 
   



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

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