C语言新手求助:输入‘bytebyte’被误判为正确密码的修复方案
密码误判问题的修复方案
问题原因
当前代码里buff的大小是5字节,fgets最多读取4个字符后自动补\0。当输入bytebyte这类长字符串时,fgets只会截取前4个字符byte存入buff,导致strcmp判定匹配,出现误判。另外原代码没处理输入后的换行符,可能导致输入正确密码加回车时反而判定错误。
修复步骤
- 处理换行符
用户输入密码后通常会按回车,fgets会把换行符\n读入缓冲区(缓冲区足够大时),这会让strcmp匹配失败。用strcspn可以快速去除换行符:
localinfo.buff[strcspn(localinfo.buff, "\n")] = '\0';
- 验证输入完整性
只靠strcmp匹配前4个字符没法确保输入是精确的byte,需要同时满足两个条件:处理后的字符串内容是byte、长度恰好为4。最简单的方式是增大缓冲区,读取完整输入后再验证。
修复后的完整代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { // 使用结构体强制局部变量内存顺序 struct { char buff[20]; // 增大缓冲区以容纳完整输入 char pass; } localinfo; localinfo.pass = 0; printf("\n Enter the password:\n"); fgets(localinfo.buff, sizeof(localinfo.buff), stdin); // 读取完整输入 // 去除换行符 localinfo.buff[strcspn(localinfo.buff, "\n")] = '\0'; // 检查密码:内容必须为"byte"且长度恰好为4 if(strcmp(localinfo.buff, "byte") != 0 || strlen(localinfo.buff) != 4){ printf ("\n Wrong Password \n"); } else { printf ("\n Correct Password\n"); localinfo.pass = 1; // 设置密码正确标记 } // 根据标记赋予权限 if(localinfo.pass){ printf ("\n Congratulations! Root privileges given to the user!\n"); } return 0; }
替代方案(保留原缓冲区大小)
如果一定要用5字节的buff,可以在strcmp匹配后检查输入缓冲区是否有剩余字符,以此判断输入是否过长:
// 在strcmp匹配成功后添加以下代码 int c; // 读取缓冲区剩余字符,直到换行或EOF while((c = getchar()) != '\n' && c != EOF); // 如果读取到的不是换行或EOF,说明输入过长,重置标记 if(c != '\n' && c != EOF){ printf("\n Wrong Password \n"); localinfo.pass = 0; }
内容的提问来源于stack exchange,提问作者Kodie Haas
相关产品推荐
相关产品推荐

