QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: whlvme

编程大赛(试刊号)——计算器出来啦

[复制链接]
发表于 2003-7-14 10:01:27 | 显示全部楼层
[quote:4215b297c0="whlvme"]没问题,经过运行测试了的。

scanf本来就是使用指针作为参数的。而fml也定义的是指针啊。

int num;

scanf("%d",&num);

这里也是使用指针,因为num不是用指针方式定义的,所以要取其地址。[/quote]

可是,fml没有分配空间啊!???

不过,我编译了一下,还真的可以用,为什么呢?
和c++不一样吗?cin.getline就需要先分配空间,然后再用,scanf是怎么实现的?
回复

使用道具 举报

发表于 2003-7-14 11:05:48 | 显示全部楼层
hibernate, 我说的是前一个人的,因为冲得太快,来不及反应,呵呵
回复

使用道具 举报

 楼主| 发表于 2003-7-14 11:28:37 | 显示全部楼层
[quote:0616f577af="raynorli"]hibernate, 我说的是前一个人的,因为冲得太快,来不及反应,呵呵[/quote]
優先級什麼的在將表達式裝入二叉樹時就可以解決了,二叉樹就是解決優先級和括號問題的。盪然,如果允許表達式包含字母,加入函數名稱檢查和函數調用,也可以支持函數的。

我就是在“將表達式裝入二叉樹”這地方卡住了。
回复

使用道具 举报

 楼主| 发表于 2003-7-14 11:32:08 | 显示全部楼层
[quote:1fa3449512="ShiChao"]
可是,fml没有分配空间啊!???

不过,我编译了一下,还真的可以用,为什么呢?
和c++不一样吗?cin.getline就需要先分配空间,然后再用,scanf是怎么实现的?[/quote]
盪然不一樣。
回复

使用道具 举报

发表于 2003-7-14 11:35:41 | 显示全部楼层
秘书长的甲骨文 我已经看不懂了 谁能"汉化"一下?
回复

使用道具 举报

发表于 2003-7-14 11:38:13 | 显示全部楼层
[quote:0b27b7386e="wsm"]秘书长的甲骨文 我已经看不懂了 谁能"汉化"一下?[/quote]
那些好像就是汉字,偶怎么汉化呢!
回复

使用道具 举报

发表于 2003-7-14 12:08:51 | 显示全部楼层
这地方太乱,我不订阅了
回复

使用道具 举报

发表于 2003-7-14 19:48:03 | 显示全部楼层
[quote:069376d5fd="whlvme"][quote:069376d5fd="ShiChao"]
可是,fml没有分配空间啊!???

不过,我编译了一下,还真的可以用,为什么呢?
和c++不一样吗?cin.getline就需要先分配空间,然后再用,scanf是怎么实现的?[/quote]
盪然不一樣。[/quote]

到底scanf是怎么实现的?动态分配内存?
回复

使用道具 举报

发表于 2003-7-14 23:30:11 | 显示全部楼层
hibernate的程序看上去不错。可惜没有缩进,看起来很费眼。我记得当初学编译原理的时候好像做过这种事情,当时很糊涂的,只能硬着头皮往下做。现在我都想不起来当初做的语法识别程序是怎么出来的了。

我觉得,如果有心想要编写一些程序的人,应该静下心来看看数据结构和编译原理两本书,不要抱着编程语言和环境不放。程序是人靠智慧编出来的,不是靠编程语言实现出来的。
回复

使用道具 举报

 楼主| 发表于 2003-7-15 00:12:31 | 显示全部楼层
说的对!
谁能把我那个程序中空缺的一段“把表达式装入二叉树”的代码补上?
现在开始招标了哦!
回复

使用道具 举报

发表于 2003-7-15 20:00:37 | 显示全部楼层
whlvme,告诉我scanf()是怎么实现的?
回复

使用道具 举报

 楼主| 发表于 2003-7-15 23:05:07 | 显示全部楼层
我没有读过内核源代码,不太清楚是怎么回事;C语言学过后好几年没用了。
我想应该是这样的吧:
int num;
scanf("%d",&num);
这里scanf从输入缓冲区读取的内容经过变换后存放到&num这个地址,而&num是编译器预先按照int类型分配好内存了的。

char yourname[8];
scanf("%s",yourname);
这里scanf从输入缓冲区读取的内容按照字符数组类型转换(回车换行转换为NULL),然后存放到yourname这个地址。

char * fml;
scanf("%s",fml);
这里scanf从输入缓冲区读取的内容按照可变长度字符串类型转换(回车换行转换为NULL),然后存放到fml这个地址。

也就是说,在C程序编译时,编译器就按照头文件(具体是哪个就忘了,stdlib.h?)中定义的长度给未指定长度的字符串分配了空间。

这样解释不知对否。
回复

使用道具 举报

发表于 2003-7-16 09:01:08 | 显示全部楼层
char yourname[8];
这里yourname应该是const指针吧!还是C不分const?


"存放到yourname这个地址" 是什么意思?是把缓冲区的字符拷贝到yourname[8]里面?还是yourname = 缓冲区指针

如果是前者,scanf()如何区分yourname是否是分配了空间的?比如
char *yourname; // 和char yourname[8]
scanf("%s", yourname);

如果是后者,yourname是const的,不能"yourname = 缓冲区指针"的吧!

我就是不明白这一点,scanf()还真是古怪
回复

使用道具 举报

 楼主| 发表于 2003-7-16 09:05:28 | 显示全部楼层
这恐怕得请教熟读内核的高手了。
回复

使用道具 举报

发表于 2003-7-16 09:37:50 | 显示全部楼层
"存放到yourname这个地址" 是什么意思?是把缓冲区的字符拷贝到yourname[8]里面?还是yourname = 缓冲区指针

如果是前者,scanf()如何区分yourname是否是分配了空间的?比如
char *yourname; // 和char yourname[8]
scanf("%s", yourname);


这不是c的最基本的概念么? 数组即指针 函数除非特别表明 否则空间由掉用者分配 (没有分配 编译的时候会有警告 运行的时候出错呗)
const的概念比较复杂 不过数组头和const没有任何关联
实际上各个编译器的对const的保护也不同:
举个例子:
const int a = 400;
一般来说不允许改变这个a的值
但有些编译器里 你可以对a的指针访问来写入值 比如 int *p =&a;*p =100;
然后你使用a的时候还是400  用到*P的时候是100 而且看到a的地址是p
这些就扯远了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 06:29 , Processed in 0.049621 second(s), 12 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表