一个简单的注册机(有错误)!!!指教!!!

来源:百度知道 编辑:UC知道 时间:2024/06/08 23:13:01
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "comutil.h"

void main (void)
{
int tmp,cst,cst2,res; //定义变量
char m_CS1[]="656C-3633";//定义C盘序列号
char buff[2]; //定义大小
char ori[]="yashayasha";//定义指定字符
char m_CS2[]="";//用户接受输出数据
int stlen=strlen(m_CS1);//获取其真实长度(9)位 可改为(int stlen=9;)
for(tmp=0;tmp<stlen;tmp++)
{
cst=int(m_CS1[tmp]);//转换类型
cst2=int(ori[tmp]);//转换类型
res=cst^cst2;//做运算
itoa(res,buff,10); //按十进制方式将res转化成字符串

m_CS2=m_CS2+buff; //过完这个for语句m_CS2就是注册码了
}
printf("%c",m_CS2);//输出一下m_CS2
}

程序至少以下几点不妥。
1. char m_CS2[]=""; 定义的是长度为1字节的字符数组变量,这个字节的值为'\0'。
但是用户接受输出数据看起来是18字节。因此,应为char m_CS2[19]=""或比19还大为宜。
2. res = cst ^ cst2;运算结果能否肯定为一位的整数?可能大部分都是两位整数。如'A'^'0'=0x71, 即113,转化成字符串占3字节,字符数组应该声明为4字节长,buff[2]根本容纳不下。
3. m_CS2 = m_CS2 + buff;是受BASIC/VB的影响吧。C/C++字符串的连接操作不是这样的。是:strcat(m_CS2, buff);
4. printf("%c", m_CS2); 把字符数组按一个字符的格式输出, 当然不对了.
建议修改成:
int main(void)
{
int i; // 定义变量
char m_CS1[] = "656C-3633"; // 定义C盘序列号
char ori[] = "yashdyasha"; // 定义指定字符
char *p, m_CS2[20] = ""; // 用户接受输出数据
int stlen = strlen(m_CS1); // 获取其真实长度 或 int stlen = 9
for (i = 0, p = m_CS2; i < stlen; i++)
{ //不考虑ori[]的长度短于m_CS1[]的长度的错误.
p += sprintf(p, "%02d", (m_CS1[i]^ori[i])%100); //取除以100的余数, 转字符串接到m_CS2里.
}
printf