MagicWin 98 1.30f 序號產生器:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define BUF_LEN 30
#define HEAD_SIZE 3
/* 前三個字元不作處理,Serial Number的長度要大於這個值 */
#define MOV_SIZE 4
/* 對Serial Number處理時,間隔4個位元組相互替換 */
void int2str(int n, char *pt);
/* 好久沒用TC20了,所以不知道怎麼將Int型的值轉換成字串 */
main () {
char S_N[BUF_LEN]; /* Serial Number 存放的陣列 */
char User_Name[BUF_LEN]; /* 使用者名稱存放的陣列 */
char *pstr, ch;
unsigned int sum = 0;
pstr = S_N;
printf("Please Enter your Serials Number: ");
scanf("%s",S_N);
if (strlen(S_N) > HEAD_SIZE) {
printf("\nPlease Enter your Name: ");
scanf("%s",User_Name);
if ((sum = strlen(User_Name)) > 0) {
pstr = User_Name; /* 將使用者名稱字元的ASCII */
sum += pstr; /* 值累加,並加上使用者名稱
*/
while (*pstr++ != '\0') /* 長度。
*/
sum += *pstr;
int2str(sum, User_Name); /* 求出這個Int對應的字串 */
pstr = S_N + HEAD_SIZE;
while (strlen(pstr) > MOV_SIZE) { /* 每隔4個字元xchg */
ch = *pstr;
*pstr = *(pstr + MOV_SIZE);
*(pstr + MOV_SIZE) = ch;
pstr++;
}
while (*pstr != '\0' && *(pstr + 1) != '\0') {
ch = *pstr;
*pstr = *(pstr+1);
/* 將最後不大於4長度的字元迴圈左移一位
*/
*(pstr+1) = ch;
pstr++;
}
pstr = S_N + HEAD_SIZE;
sum = HEAD_SIZE;
while (*pstr != '\0') {/* 從第四個字元起將轉換了得 */
*pstr += sum; /* 字串依次加上0x10 + 在
*/
*pstr += 0x10; /* 字串中該字元的位置。注:*/
pstr++; /* 第一個字元的位置為0,以此
*/
sum++; /*
類推 */
}
strcat(S_N, User_Name); /* 將User_Name字串(轉變後的) */
/* 接到S_N字串的後面,此時的 */
/* S_N字串就是正確的Code了 */
printf ("\nThe MagicWin 98 1.30f software Code is: %s \n",S_N);
}
else {
printf ("Name can't be NULL.");
}
}
else {
printf ("Serials Number Must be %d char or more.\n",HEAD_SIZE+1);
}
}
void int2str(int n, char *pt) {
int k = 0;
ldiv_t lx;
lx.quot = n;
while (lx.quot != 0) {
lx = ldiv(lx.quot, 10L);
*(pt+k) = lx.rem + 0x30;
k++;
}
*(pt+k) = '\0';
strrev(pt);
}