| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 258 人关注过本帖
标题:gets(),为什么在这种情况下不对?
收藏  订阅  推荐  打印 
meiyuling2003
Rank: 1
等级:新手上路
帖子:12
积分:230
注册:2008-8-23
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-8-23 18:36
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

你用的是什么编译器?现在gets几乎在很多地方都是被否决的了,原因是会引起缓冲区溢出。你可以使用scanf("%100s",str);或者是(如果是VC编译器)gets_s。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-8-23 20:00
VxWorks
Rank: 4
来自:WindRiver
等级:高级会员
威望:1
帖子:575
积分:6978
注册:2007-11-24

gets_s是多余的,还会引起移植的困难。

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

Yesterday is a history, tomorrow is a mystery, and now is a gift, that's why is called present.
2008-8-23 20:55
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

哦,fgets,的确是个好办法~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-8-23 22:41
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:1218
积分:13543
注册:2005-7-15
回复 3# VxWorks 的帖子

fgets 不是文件流操作的时候才使用的吗
2008-8-24 00:55
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26219
注册:2007-11-16

stdin不是文件流么?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-8-24 11:30
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:1218
积分:13543
注册:2005-7-15
回复 6# StarWing83 的帖子

这个 stdin 是标准外设输入 可以从键盘输入呀
2008-8-24 14:23
meiyuling2003
Rank: 1
等级:新手上路
帖子:12
积分:230
注册:2008-8-23

谢谢各位高手指点!
2008-8-24 17:44
VxWorks2
Rank: 1
等级:新手上路
帖子:7
积分:182
注册:2008-7-30

vfdff 在 2008-8-24 14:23 的发言:

这个 stdin 是标准外设输入 可以从键盘输入呀
要彻底搞懂这个问题,你至少要找一个unix类系统,将文件系统和驱动模型搞清楚。

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

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

吵架专用ID
2008-8-24 18:13
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.058064 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved