我如何生成一组长度完全等于 8 的所有标记
how do I generate set of all tokens of length exactly equal to 8
我需要生成大小完全等于 8.Each 的完整令牌集,令牌中的位可以采用 0 - 9
和 A -Z
中的值。例如-
以下是有效的标记:
00000000
0000000A
000000H1
Z00000XA
所以基本上我想生成从 00000000 到 ZZZZZZZZ 的所有令牌。
我如何在 C
中执行此操作
这里根本不需要递归或嵌套循环。
您只需要一个从 0 到 368-1 的计数器,然后将结果转换为以 36 为基数的输出。
也就是说,368 个字符串,每个字符串的长度为 8 个字节,即 22,568,879,259,648 个字节,或大约 20.5 TB 的数据。
假设持续速率为每秒 100 兆字节,将所有数据写入某些硬盘大约需要 63 小时。
你在我不想做我应该做的事情的那一天抓住了我1.
以下代码只生成token输出;它不会尝试在任何地方存储令牌。您可以将输出重定向到一个文件,但正如其他人指出的那样,您将需要一个更大的 boat 硬盘来存储 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;
}
示例输出:
[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
1。公平地说,几乎任何一天都以 'y'.
结尾
我需要生成大小完全等于 8.Each 的完整令牌集,令牌中的位可以采用 0 - 9
和 A -Z
中的值。例如-
以下是有效的标记: 00000000 0000000A 000000H1 Z00000XA
所以基本上我想生成从 00000000 到 ZZZZZZZZ 的所有令牌。 我如何在 C
中执行此操作这里根本不需要递归或嵌套循环。
您只需要一个从 0 到 368-1 的计数器,然后将结果转换为以 36 为基数的输出。
也就是说,368 个字符串,每个字符串的长度为 8 个字节,即 22,568,879,259,648 个字节,或大约 20.5 TB 的数据。
假设持续速率为每秒 100 兆字节,将所有数据写入某些硬盘大约需要 63 小时。
你在我不想做我应该做的事情的那一天抓住了我1.
以下代码只生成token输出;它不会尝试在任何地方存储令牌。您可以将输出重定向到一个文件,但正如其他人指出的那样,您将需要一个更大的 boat 硬盘来存储 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;
}
示例输出:
[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
1。公平地说,几乎任何一天都以 'y'.
结尾