C语言作业:用户输入密码与预设密码数组比对代码报错求助
密码比对代码错误排查与修正
原代码存在的核心问题
- 字符串比较逻辑错误:C语言中
==用于比较字符串时,对比的是两个字符串指针的内存地址,而非字符串内容。必须使用<string.h>中的strcmp()函数,当返回值为0时,才表示两个字符串完全一致。 - 循环范围与逻辑错误:
pwdquery函数的循环条件为i < 2,但预设密码数组有3个元素,无法覆盖全部预设密码,应改为i < NUM_PASSWDS。main函数中循环3次输入密码,但每次输入都会覆盖数组a的内容,最终仅用第三次输入的值去比对,完全不符合“输入密码后验证”的需求。
- 函数缺少默认返回值:
pwdquery函数在循环结束未匹配到密码时,没有明确返回值,会触发未定义行为。 - 输入体验与安全性问题:
- 输入提示未换行,光标紧跟提示信息,体验不佳;
scanf("%s", a)未限制输入长度,若用户输入超过99个字符(数组a长度为100,需留1位给字符串终止符),会导致缓冲区溢出。
修正后的代码
#include <stdio.h> #include <string.h> #define NUM_PASSWDS 3 const char *passwd[NUM_PASSWDS] = { "123foo", "bar456", "bla_blubb" }; // 返回1表示验证成功,0表示失败 int pwdquery(const char *pass) { for (int i = 0; i < NUM_PASSWDS; i++) { if (strcmp(passwd[i], pass) == 0) { printf("correct\n"); return 1; } } printf("incorrect\n"); return 0; } int main() { char a[100]; // 允许用户最多尝试3次密码 for (int i = 0; i < NUM_PASSWDS; i++) { printf("Please enter password (%d/%d): ", i+1, NUM_PASSWDS); scanf("%99s", a); if (pwdquery(a) == 1) { return 0; // 验证成功,直接退出程序 } } printf("All attempts used.\n"); return 0; }
关键修正说明
- 改用
strcmp()实现字符串内容比对; - 调整循环逻辑,每次输入密码后立即验证,匹配成功则终止程序;
- 给
pwdquery添加明确返回值,避免未定义行为; - 限制输入长度为99,防止缓冲区溢出;
- 添加尝试次数提示与失败反馈,优化交互体验;
- 将
pwdquery的参数改为const char *pass,符合const正确性原则。
内容的提问来源于stack exchange,提问作者Shams Mohammed
相关产品推荐
相关产品推荐

