黑马程序员技术交流社区
标题:
程序纠错问题:gets不安全
[打印本页]
作者:
董月峰
时间:
2014-3-18 11:08
标题:
程序纠错问题:gets不安全
本帖最后由 董月峰 于 2014-3-24 14:50 编辑
/*
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/
#include<stdio.h>
int main()
{
//定义并初始化整形len,maxlen
int len = 0,maxlen = 0;
//以及要用到的指针和字符串数组s【】,单词的s1【】
char *p,*p1,s[1024],s1[64];
//输入字符串提示用户输入
printf("请输入一句只含字母和空格的英文");
//获取字符串
gets(s);
//利用指针遍历字符串
for(p1 = s; *p1 != '\0'; p1++)
{
//没遇到空格,单词长度len就增1
if(*p1 != ' ')
len++;
//遇到空格时
else
{
//取最长单词的数为maxlen,后面遇到len比maxlen大,就互换
if(len > maxlen)
{
maxlen = len;
//这是为了找出并标记最长单词在内存初位置方便后面遍历输出
p = p1 - len;
//计算下一个单词长度前len重新赋值0
len = 0;
}
}
}
//遍历出最长的单词s1
for(int i = 0;i < maxlen;i++)
{
s1
= *(p + i);
}
//字符串最后是个‘0’;
s1[maxlen] = '\0';
//输出得到结果
printf("句中最长单词是:%s\n",s1);
return 0;
}
//
求助:1.看测试题这个格式可以吗?解释有哪些不完全的地方请指出
2.xcode报错说输出英文句子的gets不安全
注:在cfree上没事,但是xcode说gets不安全,求大神帮忙
作者:
keycola
时间:
2014-3-18 11:29
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/
不知到,兄台是不是想试试指针才这么写的,题目没有要求, 感觉那两个指针有点多余,不过程序运行是没问题的。
char *p = null, *p1 = null, s[1024] = "", s1[64] = "";
定义时候初始化一下好点
程序运行没问题,gets报的是警告吗
gets 的安全问题,在于里面定义了多少空间
s[1024] ,如果兄台输入超过 1024个char ,那么可能会出现写入内存时候出错,所以在不能控制用户输入多少个的情况下,就有的不安全。
作者:
apple_victor
时间:
2014-3-18 16:13
gets()函数可以无限读取,不会判断上限,但是应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。所有此函数如果buffer空间太小,就会发生溢出,所有它是不安全的,故而应该仔细判断,后使用
作者:
董月峰
时间:
2014-3-24 14:49
/*
5、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
*/
#include<stdio.h>
int main()
{
//定义并初始化整形len,maxlen
int len = 0, maxlen = 0, wordnum = 0;
//以及要用到的指针和字符串数组s【】,单词的s1【】
char *p,*p1,s[1024],s1[64];
//输入字符串提示用户输入
printf("请输入一句只含字母和空格的英文");
//获取字符串
gets(s);
//利用指针遍历字符串
for(p1 = s; *p1 != '\0'; p1++)
{
//没遇到空格,单词长度len就增1
if(*p1 != ' ')
len++;
//遇到空格时
else
{
wordnum = wordnum + 1;
//取最长单词的数为maxlen,后面遇到len比maxlen大,就互换
if(len > maxlen)
{
maxlen = len;
//这是为了找出并标记最长单词在内存初位置方便后面遍历输出
p = p1 - len;
//计算下一个单词长度前len重新赋值0
len = 0;
}
}
}
if(wordnum == 0)
printf("只输入了1个单词%s,它本身就是最长的",s);
else
{
//遍历出最长的单词s1
for(int i = 0;i < maxlen;i++)
{
s1[i] = *(p + i);
}
//字符串最后是个‘0’;
s1[maxlen] = '\0';
//输出得到结果
printf("句中最长单词是:%s\n",s1);
}
return 0;
}//ps 本人的程序因为没考虑只有一个单词的情况,老师给判0分,现在补上修改代码如上,以免误导后人
作者:
愿我能
时间:
2014-3-30 13:03
当时这道题没有做出来,经验收下了.
作者:
haohaoxuexi
时间:
2014-3-30 20:16
我的也是,在vc上没报错,但是在Xcode上显示警告
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2