【问题标题】:Generating a very large random number and storing it in string buffer and writing it to file生成一个非常大的随机数并将其存储在字符串缓冲区中并将其写入文件
【发布时间】:2016-12-16 10:07:44
【问题描述】:

我正在制作一个生成非常大的随机数(比如 50 位)的 C 代码,然后将其存储在字符串缓冲区中并将其复制到文本文件中。 请参考我为此编写的代码:

FILE *fp;
char first_num[MAX];
char second_num[MAX];
char *answer;
int i,test_cases,numbers;


fp = fopen("data.txt", "w+");
if(fp==NULL)
{
    printf("Error opening file\n");
    exit(1);
}  
printf("How many number combinations you wish to enter?\n");
scanf("%d",&numbers);
for(i=0;i<(2*numbers);i++)
{
    char buf1[50], *number;
    number = rand() % 100000000000000000000000000000000000000000000000000000000000000000000000;
    sprintf(buf1, "%s", number);
    fprintf(fp,"%s",buf1);
}

fclose(fp);

但是我得到一个浮点异常并且我的代码被转储了。 任何人都可以帮助我。一旦将这些随机数作为字符串存储在文件中,我实际上是在尝试将它们相乘。

【问题讨论】:

  • 数字被声明为字符指针!
  • 你没听懂我的提示.....
  • 您也可以只使用 openssl 库并在字符串或文件上生成 sha512 和,然后取任意 50 位数字。

标签: c file random


【解决方案1】:
char buf1[50], *number;
number = rand() % 100000000000000000000000000000000000000000000000000000000000000000000000;

首先,numberchar *rand 返回 int。其次,由于int 不能容纳超过 2 32 次方 - 1,因此使用具有如此高数 (10^???) 的模数是无用。我建议查看 this answer 以获取 64 位数字的可移植解决方案,但它仍然低于您尝试的解决方案

编辑:第二个选项,这将使您能够生成尽可能大的数字,可以是这样的:

  1. 创建一个大数组(位数)
  2. 生成随机数字(0
  3. 将此数字附加到数组中
  4. 重复直到获得所需的位数

示例:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
time_t t;
int i = 0;
srand((unsigned) time(&t));

const int SIZE = 1500;
char num[SIZE];
for(i = 0; i < SIZE; i++)
    num[i] = (char)(rand() % 10 + 48);
num[SIZE] = '\0';
printf("%s", num);
getchar();
}

【讨论】:

    【解决方案2】:

    为什么不将几个随机生成的unsigned int 连接到一个字符串中,直到得到一个具有正确位数的“数字”?

    【讨论】:

      【解决方案3】:
      1. 声明一个字符数组,digits[] 的长度足以容纳您的号码和结尾的 \0。

      2. 在 '1'..'9' 范围内选择一个随机字符并将其放入 digits[0]。这样可以避免前导零。

      3. 在 '0'..'9' 范围内随机选择一个字符,并将其放在 digits[] 中的下一个空白位置。

      4. 重复 #3 直到 digits[] 只剩下最后一个空位。

      5. 将终止符\0插入digits[]的最后一个位置。

      您现在在字符数组/字符串中拥有大量数字。我假设您可以将字符串写入文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-15
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 2014-04-09
        • 1970-01-01
        • 2019-11-26
        相关资源
        最近更新 更多