【发布时间】:2016-02-14 12:22:02
【问题描述】:
我有一个完全按照我想要的方式运行的程序:
#define BUF_SIZE 15
void passwordCheck (int digit)
{
static char buf[BUF_SIZE] ;
static int i = 0;
char pw[]="1234" ;
int pw_size = sizeof(pw)-1 ;
int ret ;
if (digit == 13)
{
for(i=0;i<BUF_SIZE;i++){ //why do I need this?
}
ret = memcmp(buf, pw, 4) ; //compares the array with the pw
if (ret == 0 && buf[pw_size] == 0)
{
printf("Access granted\n") ;
}
else
{
printf("Access denied\n") ;
}
}
else {
if (i > ((int)sizeof(buf) - 2)) //sets all values to 0 ?
{
i = 0;
memset(buf, 0, sizeof(buf)) ;
}
buf[i] = digit ; //stores a value
buf[i++] = digit ; //stores a values at the next stage
}
}
它检查用户是否输入了正确的密码,如果是,则授予访问权限,如果没有拒绝访问。这是Demo
但是我在理解上遇到了问题。
所以使用static int i,这样每次调用passwordCheck 时我就不会变成0?
所以如果用户不按13,passwordCheck 通过这两行将所有值存储在一个数组中
buf[i] = digit ;
buf[i++] = digit ;
如果函数第一次被调用,这个 if 语句将数组中的所有值设置为 0:
if (i > ((int)sizeof(buf) - 2))
{
i = 0;
memset(buf, 0, sizeof(buf)) ;
}
然后,当用户按下13 时,将检查数组的内容并通过
memcmp 如果匹配,则授予访问权限,否则拒绝访问。
但在这里,我特别想知道为什么我需要这个 for 循环:
for(i=0;i<BUF_SIZE;i++){
}
如果我将其注释掉,程序只会给我一次访问权限,然后再也不会。所以我假设它的作用是将区域中的所有值重置为NULL,所以和memset(buf, 0, sizeof(buf)) ;一样吗?如果是这样,为什么,它不只是一个循环?
提前致谢
【问题讨论】: