注册 登录
编程论坛 C语言论坛

很神奇的C语言问题

blanknt 发布于 2020-04-23 12:16, 2520 次点击
今天闲着没事,看了一下以前编的程序:
#include <stdio.h>

int main (){
char a[8],password[8]="123456";
printf("请输入密码:\n");
scanf("%s",&a);
if(a==password){
printf("密码正确!\n");
}else{
printf("密码错误!\n");
}
return 0;
}

这仅仅是一个简单的程序。
在你不知道密码的情况下,能输出"密码正确!"吗?
我的思路:
if(a==password)
如果是正常输入密码:
if("123456"="123456")        结果:密码正确!
那么不正常呢?
if("1")//"=="123456")
我只是输入了   "1")//
语句就变成了这个:
if("1")       //"=="123456")
是不是就能输出:密码正确!
希望有人能解答一下。
5 回复
#2
rjsp2020-04-23 12:31
char a[8], password[8];
if( a == password ) // 肯定不等嘛,因为 a 和 password 是两个不同的数组。我猜你想要的是 if( strcmp(a,password) == 0 )
更严重的是 a == password 是未定义行为。

scanf("%s",&a);
虽然运行可能没错,但逻辑上它是错误的
要么 scanf("%s",a); 要么 scanf("%s",&a[0]);
#3
forever742020-04-23 12:50
一般前面没有sizeof的时候,数组名和字符串字面量的语法意义都是它们的首元素的首地址,而不是里面的内容。
楼主的那些思路存在根源上的误区。
#4
lin51616782020-04-23 14:03
你想对标 sql注入攻击?
差远了
sql是解释执行 执行的就是你输入的文本
C代码是编译执行 编译之后 判断比较这些东西都编程汇编指令
程序不会执行你输入的文本
只是把你的输入存在内存中
#5
blanknt2020-04-23 14:10
噢噢!明白了明白了!
#6
自由而无用2021-08-10 19:20
line 3: a[8], &a[0] = 0x12ff8c;
char *pa; pa = a;
char (*ppa)[8]; ppa = (char(*)[8])&pa; ppa = &a;
scanf("%s",ppa);
#7
diycai2021-08-11 13:37
想要内存泄漏攻击,参考以下代码。

void printPassword()
{
    printf("password is 123456\n");
}

void printMax()
{
    int a[3];
    int i, n, max;
   
    printf("请输入数组大小,范围1~3\n");
    scanf("%d", &n);

    printf("请输入数值\n");
    for (i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }

    max = a[0];
    for (i=1; i<n; i++)
    {
        if (a[i] > max)
        {
            max = a[i];
        }
    }
    printf("最大的数值是%d\n", max);
}

void main()
{
    printMax();
}
只有本站会员才能查看附件,请 登录
1