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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:15:04