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

C语言新手求助:输入‘bytebyte’被误判为正确密码的修复方案

密码误判问题的修复方案

问题原因

当前代码里buff的大小是5字节,fgets最多读取4个字符后自动补\0。当输入bytebyte这类长字符串时,fgets只会截取前4个字符byte存入buff,导致strcmp判定匹配,出现误判。另外原代码没处理输入后的换行符,可能导致输入正确密码加回车时反而判定错误。

修复步骤

  1. 处理换行符
    用户输入密码后通常会按回车,fgets会把换行符\n读入缓冲区(缓冲区足够大时),这会让strcmp匹配失败。用strcspn可以快速去除换行符:
localinfo.buff[strcspn(localinfo.buff, "\n")] = '\0';
  1. 验证输入完整性
    只靠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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:50:43