You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:20:34