#include <stdio.h>int main(int argc, char* argv[])
{ char pwd[8]="windows";
char input[8];
start:
cout<<"please input your password:"<<endl;
scanf("%s", input);
if(strcmp(pwd,input)==0)
{
cout<<"ok"<<endl;
}
else
{
cout<<"error"<<endl;
goto start;
}
return 0;
} 在vc下编译运行,
输入aaaaaaaaa, 回车
再输入a,回车
结果就是“ok”了给我解释一下里面的道理吧。
{ char pwd[8]="windows";
char input[8];
start:
cout<<"please input your password:"<<endl;
scanf("%s", input);
if(strcmp(pwd,input)==0)
{
cout<<"ok"<<endl;
}
else
{
cout<<"error"<<endl;
goto start;
}
return 0;
} 在vc下编译运行,
输入aaaaaaaaa, 回车
再输入a,回车
结果就是“ok”了给我解释一下里面的道理吧。
char pwd[8]="windows";
char input[8];
这两句使
(举例,非真实情况)input在内存0x32323200-0x32323207地址空间内
而pwd位于0x32323208-0x32323210地址空间内
当你用9个a填充时,前8个a填充给input内存,而第9个a填充了位于input后面的pwd中,这使
pwd变成a
再次输入a就会成功。但是,一般来说分配地址的时候都是以16个字节为单位的
所以input在0x32323200,那么pwd应该在0x32323210,所以你应该输入17个a才能覆盖掉pwd
在第一次输入9个字符以后产生越界,将a写入了pwd,造成下次输入a就是正确的了。
#include <stdio.h>
#include <string.h>int main(int argc, char* argv[])
{
char pwd[8] = "windows";
char input[8];
printf("%s\n",pwd);
printf("%s\n",input);
start:
printf("please input your password:");
scanf("%s", input);
if(strcmp(pwd,input)==0)
{
printf("%s\n",pwd);
printf("%s\n",input);
printf("\nok\n");
}
else
{
printf("%s\n",pwd);
printf("%s\n",input);
printf("\nerror\n");
goto start;
}
return 0;
}
{
char input[8];
char pwd[8]="windows";
start:
cout<<"please input your password:"<<endl;
scanf("%s", input);
if(strcmp(pwd,input)==0)
{
cout<<"ok"<<endl;
}
else
{
cout<<"error"<<endl;
goto start;
}
return 0;
}
注意变量的定义次序。这可能和局部变量在堆栈中的存储位置有关。呵呵
最好定义一个够大的局部变量即char input[256];