C语言初学者,以下是我的代码,为什么输入超过原数组的数量,再输入正确的时候也给出一个不正确的提示

2024-11-27 11:12:56
推荐回答(2个)
回答1:

那是由于你input1[12],input2[12]是只分配了12个char型的内存空间,
如果你输入超长的字符串,
由于超出了存储空间的长度,
编译器不会报错,会继续向后面的存储区域写数据,
导致id[12],code[12]中存储的数据被改写(这个你调试的时候察看一下这两个字符串的值就可以发现),
所以id[12]和code[12]中记录的值就不是"admin","liu123"了。

如果不想有大的改动,这么改就可以:
#include
#include"string.h"

void main()
{
int i=0;
char input1[12]={NULL},input2[12]={NULL};
printf("please input ID:");
while(strcmp(input1,"admin"))
{
gets(input1);
if(strcmp(input1,"admin")!=0) {
printf("input erro.\nplease again input ID:");
for(i=0;i<12;i++)
input1[i]=NULL;}
}
printf("please input password:");
while(strcmp(input2,"liu123"))
{
gets(input2);
if(strcmp(input2,"liu123")!=0) {
printf("input erro.\nplease again input password:");
for(i=0;i<12;i++)
input2[i]=NULL;}
}
printf("wellcome!\n");
}

但是上面的代码还是很危险,因为超长的字符串,
还是会继续向后面的存储区域写数据。

回答2:

这样说吧
此bug和你使用了gets函数有关
以程序在我的机器上运行效果为例
进入第一个while之前,程序里定义的数组内存分配已经完成,如下表

首地址 数组
0x0012ff74 id
0x0012ff68 code
0x0012ff5c input1
0x0012ff50 input2

然后进入循环
首先执行 gets(input1);
而gets函数是不会检查你传递过来的指针类型的
也就是说它会从你传递给它的
input1的首地址开始,按字节将接下来的内存数据修改为输入的数据。
当你的输入超过input1数组容量时,gets会继续修改接下来的内存数据。
这样就改动了下一个数组code里的内容(就是说密码不是liu123了)
所以你再输入预设的password就error了。

所以对于标准输入输出一般不要偷懒使用gets()函数
这个函数不够安全,也会影响到程序健壮性