C 如何生成长度完全等于8的所有标记集

C 如何生成长度完全等于8的所有标记集,c,algorithm,combinations,C,Algorithm,Combinations,我需要生成一整套大小正好等于8的令牌。令牌中的每一位都可以采用0-9和A-Z中的值。比如说- 以下是有效的令牌: 00000000 0000000 A 000000 h1 Z00000XA 所以基本上我想生成从00000000到zzzz的所有令牌。 如何在C中实现这一点?这里根本不需要递归或嵌套循环 您只需要一个从0到368-1的计数器,然后将结果转换为基数36中的输出 也就是说,368个字符串(每个字符串的长度为8字节)是22568879259648字节,即大约20.5TB的数据 假设持续速率

我需要生成一整套大小正好等于8的令牌。令牌中的每一位都可以采用
0-9
A-Z
中的值。比如说-

以下是有效的令牌: 00000000 0000000 A 000000 h1 Z00000XA

所以基本上我想生成从00000000到zzzz的所有令牌。
如何在C中实现这一点?这里根本不需要递归或嵌套循环

您只需要一个从0到368-1的计数器,然后将结果转换为基数36中的输出

也就是说,368个字符串(每个字符串的长度为8字节)是22568879259648字节,即大约20.5TB的数据


假设持续速率为每秒100兆字节,将所有数据写入某些硬盘驱动器大约需要63个小时。

你发现我有一天不想做我应该做的事情1

下面的代码只生成令牌输出;它不会尝试在任何地方存储代币。您可以将输出重定向到一个文件,但正如其他人所指出的,您将需要一个更大的硬盘驱动器来存储368个字符串。也许有一种方法可以在不使用嵌套循环的情况下实现这一点,但这种方法非常简单。第一个循环更新每个位置的计数器,而第二个循环将计数器映射到符号,并将符号写入标准输出

您可以将
LEN
设置为较小的值,如3,以验证程序是否执行您想要的操作,而不生成TB的输出。或者,您可以使用一组较小的字符作为数字。理想情况下,
LEN
digs
都应该是命令行参数,而不是常量,但我已经在这方面花费了太多时间

编辑

好吧,我撒谎了。显然,我没有在这方面花费太多时间,因为我已经清除了一个小错误(第一个字符串没有正确显示,因为我在显示之前进行了更新),并且我已经完成了长度和字符集命令行输入

请注意,此代码假定为C99

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

#define DEFAULT_LEN 8

int main( int argc, char **argv )
{
  const char *default_digs="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  size_t len = DEFAULT_LEN;
  const char *digs = default_digs;

  if ( argc > 2 )
    digs = argv[2];

  if ( argc > 1 )
    len = strtoul( argv[1], NULL, 10 );

  int idx[len];
  memset( idx, 0, sizeof idx );

  size_t diglen = strlen( digs );

  for(;;)
  {
    int j = len;
    while( j )
      putchar( digs[idx[--j]] );

    putchar( '\n' );

    while ( j < len && idx[j] == diglen - 1 )
      idx[j++] = 0;

    if ( j == len )
      break;

    idx[j]++;
  }

  return 0;
}

1.平心而论,几乎任何一天都会以“y”结尾。

我投票决定将这个问题作为离题题来结束,因为在向社区寻求帮助之前,这表明我没有做出任何努力。此外,36^8是一个很大的问题strings@user49649118个循环或1个递归函数您可以使用嵌套循环或递归。不管怎样,都不可能在一天内完成。小心!这几乎是3万亿个组合。如果你把它们写成文本,你需要超过20TB来存储它们。长话短说:你一开始不想这么做。
[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 2 01
00
01
10
11

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 3 01
000
001
010
011
100
101
110
111

[fbgo448@n9dvap997]~/prototypes/tokgen: ./tokgen 2 012
00
01
02
10
11
12
20
21
22