为何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
相关产品推荐
相关产品推荐

