串行随机字符串生成器

时间:2014-09-28 15:36:18

标签: c

我正在开发一个生成序列码的程序。我知道有关于这个主题的几个主题,但我无法解决我的问题。

我想创建一个如下所示的字符串: 3S6G-TXMS-RLP6-VE5N

我只能使用大写字母和数字,每组字符(如3S6G)只能有一个最大值。其中2个数字。

我真正的困难是我必须打开Internet Explorer并将其导航到包含此序列号的地址。它看起来应该是这样的:https://www.mywebpage.com/serial/3S6G-TXMS-RLP6-VE5N

我希望有人可以帮助我,因为我自己无法找到解决方案。

目前它没有运行,当我启动程序时,它立即崩溃。我还没有实现Internet Explorer。

我的代码:

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

static const char abc[]=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"123456789";

char Str[80];
char Str2[80];
char Str3[80];
char Str4[80];
char Stra[80];
unsigned int i;

int StringLength = sizeof(abc) -1;

char genRandom() {
    return abc[rand() % StringLength];
}


int main()
{
    SetConsoleTitle("Serial Generator");

    srand(time(NULL));
    for(i = 0; i < 4; i++) {
            sprintf(Str, "%s", genRandom());
    }

    srand(time(NULL)-1);
    for(i = 0; i < 4; i++) {
            sprintf(Str2, "%s", genRandom());
    }

    srand(time(NULL)-2);
    for(i = 0; i < 4; i++) {
            sprintf(Str3, "%s", genRandom());
    }

    srand(time(NULL)-3);
    for(i = 0; i < 4; i++) {
            sprintf(Str4, "%s", genRandom());
    }

sprintf(Stra, "%s-%s-%s-%s", Str, Str2, Str3, Str4);


printf("Your serial: \n");
printf("%s \n", Stra);

return 0;
}

我是C的新手,所以如果我提出转储问题,请道歉。

1 个答案:

答案 0 :(得分:2)

警告:

我把你的代码移到Linux盒子里测试它。我能够通过以下方法成功编译代码:(a)删除#include <windows.h>行,(b)删除SetConsoleTitle("Serial Generator");

我正在使用的编译器是gcc 4.8.2

好的,我在这里看到的几件事

(1)你不需要多次调用srand。 srand种子随机数发生器。真的,非常简单地想到一个巨大的随机数表,每次你打电话给兰德,你都会获得下一个数字。 srand选择你开始在那张桌子的哪个地方。如果你连续多次打电话给srand,你很可能会得到相同的数字。

(2)为什么你的所有字符串数组大小都是80?从我所看到的,你将坚持四个字符并允许空终止符,你只需要5个字节。

(3)第三,注意编译器警告......它们是有原因的。当我编译你的代码时,我得到以下警告(我用-g -ansi -Wall -pedantic编译):

dummy.c:19:5: warning: implicit declaration of function ‘rand’ [-Wimplicit-function-declaration]
     return abc[rand() % StringLength];
     ^
dummy.c: In function ‘main’:
dummy.c:27:5: warning: implicit declaration of function ‘srand’ [-Wimplicit-function-declaration]
     srand(time(NULL));
     ^
dummy.c:29:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type    ‘int’ [-Wformat=]
             sprintf(Str, "%s", genRandom());

rand和srand都在<stdlib.h>中声明,包括这个文件摆脱了前两个错误。

下一个错误(其中有四个表单,我只显示了一个),从获取getRandom()的结果返回一个char然后尝试使用字符串格式将其写入缓冲区Str1符。请记住,char数据类型实际上是一个整数。

此外,sprintf(....)将使用新字符串覆盖缓冲区中的内容,因此在循环中调用不会附加字符串,它将覆盖内容。您可以使用如下所示的循环来完成您想要的任务:

for(i = 0; i < 4; i++) {
    Str2[i] = genRandom();
}

我怀疑这是您最初报告的错误的根本原因。

(4)变量i没有理由拥有文件范围,它应该在main中移动。

(5)你真的不需要使用这么多的字符串变量。考虑这个循环:

 Stra[4] = Stra[9]=Stra[14] = '-'
 for(i = 0; i < 4; i++) {
     Stra[i] = genRandom();
     Stra[5+i] = genRandom();
     Stra[10+i] = genRandom();
     Stra[15+i] = genRandom();
 }

通过所有这些更改和修改,您的程序现在看起来像:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*#include <windows.h>*/
#include <time.h>

static const char abc[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";

#define   STRING_LEN  20

char Stra[STRING_LEN];

int StringLength = sizeof(abc) -1;

char genRandom() {
    return abc[rand() % StringLength];
}


int main()
{
    /* SetConsoleTitle("Serial Generator");*/
    unsigned int i;

    memset(Stra, '\0', STRING_LEN);

    Stra[4] = Stra[9]=Stra[14] = '-';
    for(i = 0; i < 4; i++) {
        Stra[i] = genRandom();
        Stra[5+i] = genRandom();
        Stra[10+i] = genRandom();
        Stra[15+i] = genRandom();
    }

    printf("Your serial: \n%s \n ", Stra);
    return 0;
}

在我的Linux系统上运行此程序会产生以下结果:

 ******@ubuntu:~$ gcc -ansi -pedantic -Wall dummy.c -o dummy
 ******@ubuntu:~$ ./dummy
 Your serial: 
 II4U-LK6E-C6CN-FCMV 

最后,您的代码(以及我的答案)不会解决不超过2位数的限制。