2014-09-28 2 views
-1

나는 시리얼 코드를 생성하는 프로그램을 만들고있다. 이 주제에 관해 여러 스레드가 있음을 알고 있지만 문제를 해결할 수 없었습니다. 3S6G - TXMS-RLP6-VE5N임의의 문자열 생성기 시리얼

난 단지에만 최대를 가질 수 대문자 및 숫자와 (3S6G 같은) 문자의 모든 그룹을 사용할 수 있습니다

나는 다음과 같습니다 문자열을 만들려고합니다. 그것에서 2 개의 수의.

나의 진짜 투쟁은 인터넷 익스플로러를 열고이 시리얼을 포함하는 주소로 이동해야한다는 것입니다. 다음과 같이 표시되어야합니다 : 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

이미 작성한 코드로 질문을 편집하십시오. 기반으로 도움을주는 것이 더 쉽습니다. – Shawn

+1

와우, '사드랑'으로 뭐하고 있니? 'srand' ** 한 번 **로 전화하십시오. 당신은 또한'genRandom()'에서 하나의'char'을 돌려 주지만 그것을 여러분의 버퍼에 문자열로 출력하기 때문에 여러분의 충돌을 일으킬 수 있습니다. 질문의 전체 URL 부분이 너무 광범위합니다. – indiv

답변

2

경고 :

코드를 Linux 상자로 이동하여 테스트합니다. 나는 성공적으로 코드를 컴파일 할 수 있었다 (가) #include <windows.h> 라인과 (b)는 내가 사용하고 컴파일러는

OK, 나는 여기에서 볼 몇 가지 GCC 4.8.2입니다 SetConsoleTitle("Serial Generator");

을 제거하여 제거

(1) srand를 두 번 이상 호출 할 필요가 없습니다. srand는 난수 생성기를 시드합니다. 정말로, 난해한 숫자의 거대한 테이블을 정말로 단순하게 생각해보십시오. 전화를 걸 때마다 다음 번호를 얻습니다. srand는 그 테이블에서 당신이 어디서 시작 하는지를 골랐다. 매우 빠른 연속으로 여러 번 srand를 호출하면 항상 같은 수를 얻을 수있는 좋은 기회가됩니다.

(2) 문자열 배열의 크기가 모두 80 인 이유는 무엇입니까? 내가 볼 수있는 것부터 네 문자를 고집하고 null 종결자를 허용하므로 5 바이트 만 필요합니다.

(3) 셋째, 컴파일러 경고에주의하십시오 ... 이유가 있습니다.

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()); 
랜드와 srand를 모두 <stdlib.h>에 선언

이 파일을 포함하는 제 두 가지 오류를 제거있어 : 나는 당신이 코드를 컴파일 할 때 나는 다음과 같은 경고 (-g -ansi -Wall -pedantic 컴파일 I)를 얻을 .

다음 오류 (그 중 네 가지 형식이 있는데 하나만 표시했습니다), char을 반환하는 getRandom() 결과를 얻은 다음 문자열을 사용하여 버퍼를 문자열 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(); 
} 

:이 루프를 고려 마지막으로

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

:

#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; 
} 

내 리눅스 시스템에서이 프로그램을 실행하면 다음과 생산 , 귀하의 코드 (따라서 내 대답) 두 자리 이상의 제한을 해결하지 않습니다.

+1

아주 좋습니다! 마이너 노트 : 1. 당신의 컴파일러 플래그는'gcc'에 한정됩니다 (편집 : 당신이 저를 'jus'가 무시한다는 것을 보았습니다.). 2. 0에서 2 자리 사이의 숫자를 생성 한 다음 4의 임시 배열을 문자로 더 채우고 섞습니다. – usr2564301

관련 문제