QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: whlvme

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

[复制链接]
发表于 2003-7-16 18:50:30 | 显示全部楼层
我是说
char *s;
scanf("%s", s);

char s[8];
scanf("%s", s);

哪个对?

我明白"数组即指针 函数除非特别表明 否则空间由掉用者分配"
可是
char *s;
scanf("%s", s);
确实可以执行,而且没错。
如果我输入了一个字符串, s的空间从哪来?
回复

使用道具 举报

发表于 2003-7-16 19:23:30 | 显示全部楼层
char *s;
scanf ("%s",s);
确实能执行,但会出错!!
scanf读入的数据放到了未知的内存中,可以肯定的是字符串的开头在s中
字符串超过一个字节后,就会覆盖在s存放空间以后的空间。
不会出错,那是因为你输入的字符串不过长,还没有覆盖有用的空间(没扰乱
内存),如果你输入长一点的字符串,那么程序就会发生错误。
试试看,我在w2k下就是这种情况,linux下以后再试,现在没机会
所以,一定要给s分配空间,再scanf
回复

使用道具 举报

发表于 2003-7-16 19:24:47 | 显示全部楼层
在linux下也应该一样
回复

使用道具 举报

 楼主| 发表于 2003-7-16 20:16:34 | 显示全部楼层
在scanf的实现机制或者说C编译器的机制上,Win2K和Linux是完全不同的,Linux采取了更安全的措施。

scanf只是输入一行内容,一般情况下,即使特殊的实际应用场合,一行内容也不会超过256个字符,所有编译时使用的动态数组的长度宏MAX_SIZE一般也定义为256。

当然如果你在屏幕上输入超过MAX_SIZE个字符不回车的话,实际上系统是不允许你继续输入下去的,因为缓冲区已经溢出,输入的内容被系统忽略了。

to ShiChao:综上所述,字符串空间实际上是编译器分配的。
回复

使用道具 举报

发表于 2003-7-16 21:55:27 | 显示全部楼层
[quote:b4b450a423="Linux_Lyb"]char *s;
scanf ("%s",s);
确实能执行,但会出错!!
[/quote]

看看我的代码
[code:1]
E:\temp>type main.cpp
#include <stdio.h>

int main()
{
        char *s;

        scanf("%s", s);
        printf("%s", s);
        return 0;
}

E:\temp>cl main.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

main.cpp
main.cpp(7) : warning C4700: local variable 's' used without having been initial
ized
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:main.exe
main.obj

E:\temp>main
hello
hello
E:\temp>
[/code:1]
我是在2k上,没有出错啊!
回复

使用道具 举报

发表于 2003-7-16 21:58:48 | 显示全部楼层
whlvme
你的意思是,当我用char *s; scanf("%s", s);的时候,编译器已经给我改成了
char s[MAX_SIZE];?
回复

使用道具 举报

 楼主| 发表于 2003-7-16 22:05:48 | 显示全部楼层
对于C语言,一般是这样的。所以你不用担心啦。
实际的应用项目涉及的东西太多了,如果在细节问题上花费太多的时间,效率就不高了。
回复

使用道具 举报

发表于 2003-7-16 22:12:24 | 显示全部楼层
en 谢谢执教,明白了
回复

使用道具 举报

发表于 2003-7-18 14:54:00 | 显示全部楼层
计算器做得实在是太简陋了。
回复

使用道具 举报

 楼主| 发表于 2003-7-18 14:55:17 | 显示全部楼层
[quote:6063f0b2eb="howay"]计算器做得实在是太简陋了。[/quote]
既然是赛,你也可以做个更好的哦。
回复

使用道具 举报

发表于 2003-8-17 09:45:41 | 显示全部楼层
我离开一个月啊
怎么都没有进展呢
回复

使用道具 举报

发表于 2003-8-17 13:57:45 | 显示全部楼层
发现办比赛的条件还不成熟,这里基本是个FAQ,没多少人能来比赛的~~
回复

使用道具 举报

发表于 2003-8-18 08:21:58 | 显示全部楼层
[quote:f187a65e7e="hibernate"]我离开一个月啊
怎么都没有进展呢[/quote]

这一个月我都在忙着学习啊,开学还得考试呢,惨啊
回复

使用道具 举报

发表于 2003-8-23 22:53:23 | 显示全部楼层
lex&yacc
做计算器最方便!
回复

使用道具 举报

发表于 2003-8-24 18:29:54 | 显示全部楼层
是最偷懒~~
回复

使用道具 举报

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

本版积分规则

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

© 2021 Powered by Discuz! X3.5.

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