有以下代码,我需要返回一个访问级别,该访问级别在0x30以下且不等于0或2:
int login() {
int accessLevel = 0xff;
char username[16];
char password[32];
printf("Username (max 15 characters): ");
gets(username);
printf("Password (max 31 characters): ");
gets(password);
if (!strcmp(username, "admin") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 2;
} else if (!strcmp(username, "root") && !strcmp(password, "{{ create_long_password() }}")) {
accessLevel = 0;
} else if (!strcmp(username, "artist") && !strcmp(password, "my-password-is-secret")) {
accessLevel = 0x80;
}
return accessLevel;
}
我输入了用户名16'a',将accessLevel重置为0(然后添加了将access设置为20并提供所需输出的空间)。 但是,我希望缓冲区会覆盖密码,而不是accessLevel,因为它是“后续内存”。 我想我误解了缓冲区的工作原理,并希望得到一个解释。 另外,为什么第16个字符重置为0?
谢谢!
答案 0 :(得分:2)
Strcmp将匹配由空终止char的第一个实例给出的任意数量的char。所有字符串文字都必须为空,以\ 0
结尾使用strncmp只会比较争论中给出的字符数和数量
答案 1 :(得分:1)
不保证局部变量在堆栈上的顺序(假设在是堆栈)没有任何特定的顺序。它很大程度上取决于变量的类型以及每个变量的所需对齐方式,并且可以根据编译器或优化设置进行更改。
在这种情况下,听起来好像变量按照它们在代码中出现的顺序被压入堆栈,这意味着它们的地址将逐渐减少。