发信人: chaojie (chaojie), 信区: Computer
标 题: Re: 捉虫大赛分数及获奖名单公布
发信站: BBS 哈工大紫丁香站 (Sat Dec 10 16:48:29 2005)
第三部分第一题(!!!后面为正确答案)
/* 题目:注册码生成
注册码是一种常用的软件保护方案,为了保证注册码不被认错,不被抄错,
需要精心挑选可以使用的字符。
下面是一个 注册码 编码方案 :
1.采用3,4,8,a, e, f, h, k, m, n, p, r, t, w, x, y
分别用来替代16进制中的0~9, a~f
2.产生的注册码就是利用以上提供的16个字符,将一个字符型数据,转换成两个输出。
注册码生成的算法说明:
初始化的时候建立一个哈希表,用来存放每个字符对应的两个转换后的字符,如:
1. 0x00 对应 '3','3'
2. 0x11 对应 '4','4'
3. 0x8b 对应 'm','r'
这个哈希表是一个索引,然后把输入的字符按哈希表,索引出其对应字符,拷到输出缓
冲区中。
本程序由2个函数构成 init_cache 和 encode ,init_cache 是程序数据
的初始化函数 ,encode函数 负责把数据编码成 注册码。
请找出下面代码中的错误。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char cache[256][2];
int init_cache()
{
int cIndex,calphaTable = {'3', '4', '8', 'a', 'e', 'f', 'h', 'k','m', 'n', 'p'
, 'r', 't', 'w', 'x', 'y'};
for(cIndex = 0; cIndex < 256; cIndex++);
{
cache[cIndex][0] = calphaTable[cIndex & 0xf0];
cache[cIndex][1] = calphaTable[cIndex & 0x0f];
}
return 1;
}
int encode(char *v, int vLen, char *buf, int bufLen)
{
for(int i= 0; i < vLen; i++){strcat(buf + 2 * i, cache[*(v + i)]);}
return 1;
}
错误:
1.calphaTable = {'3', '4', '8', 'a', 'e', 'f', 'h', 'k','m', 'n', 'p', 'r'
, 't', 'w', 'x', 'y'};
应该改为:
calphaTable[16] = {'3', '4', '8', 'a', 'e', 'f', 'h', 'k','m', 'n', 'p',
'r', 't', 'w', 'x', 'y'};
或者calphaTable[] = {'3', '4', '8', 'a', 'e', 'f', 'h', 'k','m', 'n', 'p
', 'r', 't', 'w', 'x', 'y'};
这个10分
2.cache[cIndex][0] = calphaTable[cIndex & 0xf0];
这行代码应该改为:
cache[cIndex][0] = calphaTable[cIndex>>4];
或者是:
cache[cIndex][0] = calphaTable[cIndex / 16];
这个20分
3.encode函数中应该加入判断错误的语句:
if(2 * vLen >= bufLen)
{
//错误处理代码
}
这个30分
3.for(cIndex = 0; cIndex < 256; cIndex++);
这行改成:
for(cIndex = 0; cIndex < 256; cIndex++)
这个10分
4.cache[*(v + i)]
这个地方应该是:
cache[*(unsigned char *)(v + i)]
或者把int encode(char *v, int vLen, char *buf, int bufLen)改成int encode
(unsigned char *v, int vLen, char *buf, int bufLen)
这个15分
5.strcat(buf + 2 * i, cache[*(v + i)])
这行极可能导致内存访问越界,可以改为:
strncat(buf + 2 * i, cache[*(v + i)], 2]
当然这个里的cache[*(v + i)]的错误见错误4
或者是把char cache[256][2];改成char cache[256][3];
这个15分
【 在 chaojie (chaojie) 的大作中提到: 】
: 试题及参考答案
: 第一部分
: 1. 计算1-1/3+1/5-1/7+...直到最后一项小于10e-4(有1个语法错误)
: #include <math.h>
: main()
: {
: float pi, sum = 0, term, sign = 1.0;
: int count = 0, n = 1;
: ...................
--
※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 202.118.249.98]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.003毫秒