有以下代码,我需要返回低于 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' 将访问级别重置为 0(然后添加空格将访问权限设置为 20 并给我所需的输出(。 但是,我希望缓冲区覆盖密码,而不是访问级别,因为它是"跟随内存"。 我想我误解了缓冲区的工作原理,并希望得到解释。 另外,为什么第 16 个字符重置为 0?
提前感谢!
Strcmp 将匹配任意数量的字符,由空终止字符的第一个实例给出。所有字符串文本必须以 \0 结尾 null
使用 strncmp 只会比较参数中给出的字符数和数量
堆栈上局部变量的顺序(假设存在堆栈(不保证按任何特定顺序排列。 它在很大程度上取决于变量的类型以及每个变量所需的对齐方式,并且可以根据编译器或优化设置进行更改。
在这种情况下,听起来变量按照它们在代码中出现的顺序被推送到堆栈上,这意味着它们的地址将逐渐减少。