#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”了给我解释一下里面的道理吧。

解决方案 »

  1.   

    input声明只有8个字节,输入9个字节,已越界,建义改成 input[256];但为什么为第二次输入就OK了,解释不清!!
      

  2.   

    但为什么为第二次输入就OK了,解释不清!!到else中去了。
      

  3.   

    看看缓冲区溢出攻击的相关内容吧
    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
      

  4.   

    这可能和你变量定义的顺序有关系。使用下面我的这个测试的例子,你就可以看到变量变化的过程。
    在第一次输入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;
    }
      

  5.   

    可能是数组越界了,冲了pwd 中存的内容。
      

  6.   

    你可以将你的程序改为:#include <stdio.h>int main(int argc, char* argv[])
    {
                      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];
      

  7.   

    input越界写入了pwd,因为字符串是以'\0'判断结束的,所以pwd就被截断为“a”了。呵呵
      

  8.   

    同意liutaoxwl当你输入9个a之后,你的input数组是“a/0ndows",strcmp函数遇到”/0“就会结束比较,所以你第二次输入a就会得到两字符串相同的结果
      

  9.   

    http://dev.csdn.net/develop/article/41/41751.shtm