C语言数组,

前云 2009-09-26 09:50:29

#include<stdio.h>
#include<windows.h>
main() /*主菜单*/
{
char select[2];

while(1)
{
system("cls");

printf("\t\t\t 学生信息管理系统\n\n");
printf("\t\t\t1-导入、保存学生信息文件\n");
printf("\t\t\t2-学生信息库存维护\n");
printf("\t\t\t3-学生信息查询\n");
printf("\t\t\t4-学生信息统计\n");
printf("\t\t\t5-学生信息输出\n");
printf("\t\t\t0-退出\n");
printf("输入你的选择(0--5):");
gets(select); //这里可以输入任意多个字符
if(strlen(select)==1)
switch(select[0])
{
case '1': printf("\t\t\t1-导入、保存学生信息文件\n"); break;
case '2': printf("\t\t\t2-学生信息库存维护\n"); break;
case '3': printf("\t\t\t3-学生信息查询\n"); break;
case '4': printf("\t\t\t4-学生信息统计\n"); break;
case '5': printf("\t\t\t5-学生信息输出\n"); break;
case '0': exit(0);
default: system("cls");printf("输入错误!\n按“Enter”键返回!");
}
}
}


gets(select);//select定义的大小为2,但可以输入很多个字符,程序运行正常,
那多输出的字符到那里去了。

单独运行gets(select);输入很多个字符就不行了。
你可以运行一下

...全文
210 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
前云 2009-09-26
  • 打赏
  • 举报
回复
上面这个程序你输入50个100个都没问题。不信你试一下
thy38 2009-09-26
  • 打赏
  • 举报
回复
select[2];
你要是输入5个字符,那么内存里会是这样:
select: abcde
被你占用了5个字节,最后程序结束了,只有前面两个字节被释放,后面3个成为了孤儿,相当于内存泄漏。
zgjxwl 2009-09-26
  • 打赏
  • 举报
回复
gets(select);//select定义的大小为2,但可以输入很多个字符,程序运行正常,
那多输出的字符到那里去了。


它是越界写入了。。。。只是没错而已。每次你取的都是select[0]
如果你越界写入不会出错的话。。。程序就不会出错,但是如果越界写入出错的话。。。那就挂掉了。
你可以自己单步进去看。。。就是这样的。
selooloo 2009-09-26
  • 打赏
  • 举报
回复

你不按套路出牌,OS会很不高兴的,发不发脾气就要看OS本身了。
hduzn 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liao05050075 的回复:]

char select[2];

多输入的字符直接写在select数组的后面,也就是说,数组下标越界了。此时很危险,程序很可能会挂掉
[/Quote]

应该是这样的吧~~
wanjingwei 2009-09-26
  • 打赏
  • 举报
回复
gets()函数接收的输入大小不受限制,于是有人利用这个,通过输入覆盖操作系统所占的内存,制造了蠕虫病毒。如果是重要的程序,最好谨慎使用这个函数。
前云 2009-09-26
  • 打赏
  • 举报
回复
用的是VC6.0
前云 2009-09-26
  • 打赏
  • 举报
回复
我运行了很多次没出现什么问题。
liao05050075 2009-09-26
  • 打赏
  • 举报
回复
gets(select);//select定义的大小为2,但可以输入很多个字符,程序运行正常,
那多输出的字符到那里去了。

char select[2];

多输入的字符直接写在select数组的后面,也就是说,数组下标越界了。此时很危险,程序很可能会挂掉
sytstarac 2009-09-26
  • 打赏
  • 举报
回复
只是修改了非法区域的数据,应该不会造成内存泄漏。
yuboyanyuboyan 2009-09-26
  • 打赏
  • 举报
回复
你读入的数据只有char[2],你这个程序已经越界,你可以把输入select输出一下,你用的最少是vc6.0,tc不支持中文,改用tc调试吧。问题应该就出来啦
ssm1984119 2009-09-26
  • 打赏
  • 举报
回复
越界的问题,还需要讨论这么长时间!
youjianwanlei 2009-09-26
  • 打赏
  • 举报
回复
gets()函数的功能是从标准输入流stdin中读入一个以换行符结尾的字符串到s,并用空字符(\0)代替s的换行符。gets允许输入串中包含某种空白字符如空格、制表符等。如果调用成功,则返回字符串参数s;如果遇到文件结束或出错,将返回NULL。

Memorycn 2009-09-26
  • 打赏
  • 举报
回复
据说gets()不安全
会造成缓冲区溢出
已经不建议使用了

如果后面还有读取字符的操作的话
没准就会发生错误了

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧