C语言为结构体成员生成随机账号时出现重复及位数不足问题
问题根因
- 两个账号随机数完全相同:你错误将
randomAccountNumber数组的栈内存起始地址强制转换为int类型赋值给accountNumber,两次循环中该数组在栈上的起始地址固定,因此转换后的值完全一致,并未实际存储生成的随机数内容。 - 账号偶尔只有7位:你的随机数生成逻辑存在多处错误:首先数组未初始化就执行
+=操作属于未定义行为,其次你没有将逐位生成的数字拼接为完整整数,另外如果生成的数字首位为0,输出时会自动省略前导0,自然就会出现7位的情况。
另外你的代码还存在两个隐藏问题:一是未包含<time.h>头文件调用time()会触发编译警告,二是fgets会读取输入末尾的换行符,输出账号信息时会多出空行。
修复后完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> struct users { char accountHolderName[40]; int accountNumber; char accountPassword[30]; }; int main() { // 随机数种子全局只需要初始化一次 srand(time(NULL)); int ctr; struct users* accounts[2]; for (ctr = 0; ctr < 2; ctr++) { accounts[ctr] = (struct users*)malloc(sizeof(struct users)); // 内存申请失败判断 if (accounts[ctr] == NULL) { perror("malloc failed"); return 1; } printf("What is the name of the account holder?: "); fgets(accounts[ctr]->accountHolderName, 40, stdin); // 去掉fgets读取的末尾换行符 accounts[ctr]->accountHolderName[strcspn(accounts[ctr]->accountHolderName, "\n")] = '\0'; // 直接生成8位随机数,范围10000000~99999999,保证固定8位 accounts[ctr]->accountNumber = 10000000 + rand() % 90000000; printf("Please enter a password: "); fgets(accounts[ctr]->accountPassword, 30, stdin); // 去掉密码末尾的换行符 accounts[ctr]->accountPassword[strcspn(accounts[ctr]->accountPassword, "\n")] = '\0'; } // 打印账号 printf("\n\nAccount users: \n"); for (ctr = 0; ctr < 2; ctr++) { printf("\nAccount holder name: %s\n", accounts[ctr]->accountHolderName); printf("Account password: %s\n", accounts[ctr]->accountPassword); printf("Random Account number generated: %d\n\n", accounts[ctr]->accountNumber); // 释放申请的堆内存 free(accounts[ctr]); } return 0; }
修复说明
- 直接通过
10000000 + rand() % 90000000生成8位随机数,从根源上避免了前导0的问题,生成的数天然固定8位 - 去掉了错误的数组转int操作,直接将生成的随机数赋值给结构体成员,两次循环生成的数完全独立不会重复
- 补充了必要的头文件,添加了内存判空和释放逻辑,修复了
fgets读取换行符导致输出多空行的问题
内容的提问来源于stack exchange,提问作者SimTim124
相关产品推荐
相关产品推荐

