You need to enable JavaScript to run this app. 为何C++随机密码生成程序的for循环首次迭代就终止
优惠活动
大模型
产品
解决方案
定价
更多

为何C++随机密码生成程序的for循环首次迭代就终止

C++随机密码生成程序循环终止问题修复

问题根因

  • 指针p未初始化就直接解引用写入,属于野指针非法内存访问,直接触发程序崩溃,是循环仅执行一次就终止的核心原因。
  • char password[] = ""、char characters[] = ""定义的数组长度仅为1(仅能存储字符串结束符\0),后续strcat拼接、数组赋值操作均会发生缓冲区越界,进一步触发非法内存访问。
  • 自定义random函数每次调用都读取当前时间戳,同一秒内多次调用返回值完全一致,生成的随机数无随机性。
  • generateCharacters函数中索引计算逻辑random()*(strlen(choice)+1)会产生等于字符串长度的索引,取到字符数组末尾的\0,不符合字符选取要求。

修复后可运行代码

#include<iostream>
#include<cstring>
#include<cmath>
#include <ctime>

using namespace std;

// 初始化一次随机种子保证随机性
float random(){
  static bool init = false;
  if(!init) {
    srand(time(NULL));
    init = true;
  }
  return (float)rand() / RAND_MAX;
}

void generateCharacters(char choice[],char *p){
  // 索引范围控制在[0, strlen(choice)-1]避免取到结束符
  float r=random()*strlen(choice);
  *p = choice[int(r)];
}


int main(){
  // 预分配足够大的数组空间避免缓冲区越界
  char password[256] = "";
  char characters[256] = "";
  // 给p分配有效内存空间避免野指针
  char p[2] = "";
  char numbers[] = "0123456789";
  char smallLetters[] = "abcdefghijklmnopqrstuvwxyz";
  char capitalLetters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  char symbols[] = "`~!@#$%^&*()_+-={}[]:'.,><?";
  int length=6,i;

  for(i=0;i<length;i++){
    generateCharacters(numbers,p);
    p[1]='\0';
    strcat(characters,p);

    generateCharacters(smallLetters,p);
    p[1]='\0';
    strcat(characters,p);

    generateCharacters(capitalLetters,p);
    p[1]='\0';
    strcat(characters,p);

    generateCharacters(symbols,p);
    p[1]='\0';
    strcat(characters,p);
    
    password[i] = characters[int(random()*strlen(characters))];

    cout<<endl<<"第"<<i+1<<"次循环执行完成";
  }

  cout<<endl<<"循环执行完成,后续代码正常运行";
  password[length]='\0';
  cout<<endl<<"生成的密码 = "<<password;
  return 0;
}

内容的提问来源于stack exchange,提问作者roopaish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 03:06:08