C语言简易登录程序strcmp验证异常求助
修复C语言登录程序中strcmp()验证失败的问题
嘿,我刚看完你的问题——明明输入了正确的学号和密码,strcmp()却总是判定为错误,这种情况我之前也碰到过,大概率是输入处理的细节没做好。我帮你梳理下常见的坑,再给你一份修正后的代码。
首先先说说可能导致问题的几个关键点:
- 字符串缺少结束符
'\0':如果用getch()这类函数输入密码,你得手动给输入的字符串加上结束符,不然strcmp()会一直读到内存里的垃圾值,自然对比不对。 - 输入缓冲区残留的换行符:比如先用
scanf()读学号,回车的换行符会留在缓冲区里,要是后续读密码时没处理,可能会被当成密码的一部分。 - 数组长度不够:如果预设的学号/密码或者输入的内容超过了你定义的数组长度,会导致缓冲区溢出,破坏字符串结构。
结合你提到的代码片段(里面有conio.h,应该是用了getch()隐藏密码输入),我写了一份修正后的完整代码:
#include<stdio.h> #include<string.h> // 注意:conio.h是非标准库,仅部分编译器(如Dev-C++、Turbo C)支持,若用GCC可能需要替换输入方式 int main() { // 预设正确的学号和密码 char correctStudentID[] = "Claran123"; char correctPassword[] = "MySecurePwd123"; // 定义足够大的数组存储输入内容,避免溢出 char inputID[50]; char inputPwd[50]; printf("Enter Student ID: "); // 限制输入长度为49,留一个位置给结束符 scanf("%49s", inputID); // 清空输入缓冲区的残留换行符,避免干扰后续密码输入 while(getchar() != '\n'); printf("Enter Password: "); int idx = 0; char ch; // 用getch()实现密码隐藏输入 while((ch = getch()) != '\r') { // Windows下回车是\r,Linux/macOS是\n,按需调整 // 处理退格键,优化输入体验 if(ch == '\b' && idx > 0) { printf("\b \b"); // 清除屏幕上的星号 idx--; continue; } inputPwd[idx++] = ch; printf("*"); // 用星号代替明文显示 } inputPwd[idx] = '\0'; // 关键!手动添加字符串结束符,否则strcmp无法正常工作 printf("\n"); // 验证学号和密码 if(strcmp(inputID, correctStudentID) == 0 && strcmp(inputPwd, correctPassword) == 0) { printf("Login Successful!\n"); } else { printf("Wrong Password or Student ID\n"); } return 0; }
重点修正的几个地方:
- 手动添加
'\0':用getch()输入密码时,系统不会自动添加字符串结束符,必须手动在输入完成后补上,这是strcmp()能正确对比的前提。 - 清空输入缓冲区:读完学号后用
while(getchar() != '\n')把缓冲区里的换行符全部清掉,防止后续读取密码时把换行符当成输入内容。 - 限制输入长度:
scanf("%49s", inputID)确保输入的学号不会超过数组容量,避免缓冲区溢出导致的奇怪问题。 - 退格键处理:增加了退格键的逻辑,让用户输入密码时可以删除错误字符,更符合实际使用场景。
另外还要注意,strcmp()是区分大小写的,如果你的预设账号密码是大写,输入小写也会判定错误,这点也要留意哦。
内容的提问来源于stack exchange,提问作者Lawrence McClarence
相关产品推荐
相关产品推荐

