我正在开发一个生成序列码的程序。我知道有关于这个主题的几个主题,但我无法解决我的问题。
我想创建一个如下所示的字符串: 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的新手,所以如果我提出转储问题,请道歉。
答案 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位数的限制。