发信人: 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)
页面执行时间:1.954毫秒