| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 978 人关注过本帖
标题:gets(),为什么在这种情况下不对?
只看楼主 加入收藏
meiyuling2003
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-8-23
收藏
 问题点数:0 回复次数:8 
gets(),为什么在这种情况下不对?
#include "stdio.h"

#include "string.h"
void main()
{
    int upper=0,lower=0,space=0,digit=0,other=0,i=0;
    char *p,s[50];
    printf("input string:");
    gets(s);
//while((s[i]=getchar())!='\n')  i++;
    p=&s[0];
    while(*p!='\n')
     {
         if(*p>='A'&&*p<='Z') upper++;
         else if(*p>='a'&&*p<='z') lower++;
         else if(*p==' ') space++;
         else if(*p>='0'&&*p<='9') digit++;
         else other++;
         p++;
     }
     
     printf("\nupper:%d,lower:%d,space:%d,digit:%d,other:%d\n",upper,lower,space,digit,other);
   
   
}
今天在运行时,发现用gets(s)不对,而应该用下一个形式,记得在我以前编的程序里,gets()也这样用是对的呀,谁能解释一下?
搜索更多相关主题的帖子: gets 
2008-08-23 18:36
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
你用的是什么编译器?现在gets几乎在很多地方都是被否决的了,原因是会引起缓冲区溢出。你可以使用scanf("%100s",str);或者是(如果是VC编译器)gets_s。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-08-23 20:00
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
gets_s是多余的,还会引起移植的困难。

char *p,s[50];
printf("input string:");
fgets(s,50,stdin);

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-08-23 20:55
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
哦,fgets,的确是个好办法~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-08-23 22:41
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 3# VxWorks 的帖子
fgets 不是文件流操作的时候才使用的吗
2008-08-24 00:55
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
stdin不是文件流么?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-08-24 11:30
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 6# StarWing83 的帖子
这个 stdin 是标准外设输入 可以从键盘输入呀
2008-08-24 14:23
meiyuling2003
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-8-23
收藏
得分:0 
谢谢各位高手指点!
2008-08-24 17:44
VxWorks2
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-7-30
收藏
得分:0 
[bo][un]vfdff[/un] 在 2008-8-24 14:23 的发言:[/bo]

这个 stdin 是标准外设输入 可以从键盘输入呀


要彻底搞懂这个问题,你至少要找一个unix类系统,将文件系统和驱动模型搞清楚。

unix中的文件分设备文件和数据文件(常规意义上的文件),stdin是关联到终端设备的输入文件流,数据文件打开后也会关联到一个FILE流。
设备和磁盘文件都mount一个dev结构体到VFS中,dev中包含open,write,read等函数指针,指向驱动中操作设备的相关函数。
C中的文件操作都是调用系统的open,write,read等接口,不管文件是设备还是磁盘文件,不同之处在驱动中,OS和C都不用管下面驱动的细节,上层是统一的接口。这就是伟大的unix哲学思想。

上面只是简化的描述,常见的系统比这个复杂一点。

吵架专用ID
2008-08-24 18:13
快速回复:gets(),为什么在这种情况下不对?
数据加载中...
 
   



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

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