Contents
  1. 1. 原题
  2. 2. 一种解法
  3. 3. 测试&输出

原题

请用C语言编写一个函数char hexStr2DecStr(char hexStr),将类似1B, 1C这样字符串转化为十进制字符串26, 27,输入字符串的范围了[0,1000]。
注意不要使用函数库。

一种解法

  以上是题目内容,这个其实没有什么算法,就是看你对C语言的熟悉程度。事实上我已经很久没有编写过C程序,许多语法特点都已经和java混淆了,但是考虑到面试笔试有不少C程序,所以既然遇到就拿来练习一下吧。

  题目要求不使用函数库,这对我这种C语言渣渣来说正中下怀,因为我根本不记得什么函数库。

  经过一番嗑嗑巴巴修改,程序终于完成了,期间犯了一些比较低级的错误:

1. 语句块没用{}包起来,最近看算法python写得有点多
2. 直接返回函数内部生成的数组,java用多了(java数组在堆里)。

  因为这些错误我第一次用了gdb么个东西,还好以前也算用过pdb,有点像。

  唯一值得一提的是将Hex的各位取权值时,用位移会比较简洁,而下面将int转Str时,我就想不出什么简洁办法了,C似乎没有幂运算符(不能使用函数库)。

  int转str有点粗暴,不过题目说了输入不大于1000,这么做也没问题吧,硬要我写成通用形式可能有点长。
(题目没看仔细忘了处理小写a-z,多加一个else if即可)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
char *hex2dec(const char *hex) {
//check len
int l;
for (l = 0; hex[l]; l++);
// convert to int
int i, e = 0, sum = 0;
for (i = 0; i < l; i++) {
if ('0' <= hex[i] && hex[i] <= '9') {
e = hex[i] - '0';
} else if ('A' <= hex[i] && hex[i] <= 'F') {
e = hex[i] - 'A' + 10;
}
sum += e << (l - i - 1) * 4; //每左移4位等效于×16
}
//convert to dec string
static char s[5];
int p = 0;
if ((e = sum / 1000) != 0) {
s[p] = e + '0';
p++;
}
if ((e = (sum % 1000) / 100) != 0) {
s[p] = e + '0';
p++;
}
if ((e = (sum % 100) / 10) != 0) {
s[p] = e + '0';
p++;
}
s[p++] = sum % 10 + '0';
s[p] = 0;
return s;
}
int main(int argc, const char *argv[]) {
char *s;
if (argc > 1) {
s = hex2dec(argv[1]);
printf("%s\n", s);
}
else
printf("input a hex string");
return 0;
}

测试&输出

1
2
3
4
5
chen@vaio:/tmp/hex2dec$ gcc -g hex2dec.c -o h2d
chen@vaio:/tmp/hex2dec$ ./h2d FF
255
chen@vaio:/tmp/hex2dec$ ./h2d 2A
42
Contents
  1. 1. 原题
  2. 2. 一种解法
  3. 3. 测试&输出