原题
请用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) { int l; for (l = 0; hex[l]; l++); 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; } 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
|