同学在MSN CDC电话面试(可惜我在被面试的时候全然没有这么具体的问题了:))中的一个题目:将16进制的字符串转化为10进制数字,例如“1A”,则对应26。题目很简单,实现起来也容易,依稀记得C里面有函数可以转化。刚好很久前有一个工作了的同学问起,自是给了一个方案。昨晚(050703)实在无聊,于是本着“写过才是自己的原则”,写了一个实现,其中对于16进制字符串非法的处理不是很好(返回-1),但是已经不想改了。(自己写的时候才知道原来Horner法则的实现都生疏了不少,思及最近多在模式、架构和软件过程、文档上花时间(项目使然,也没有办法:)),实在不能忘本了。)
参考代码如下:
//main.cpp
#include <iostream> using namespace std;
int StrToNum16(const char* str); int Char16ToInt(char c); bool IsValidateStr16(const char* str);
int main(int argc,char* argv[]) { #ifdef _DEBUG char* str = "78AB";
long i = StrToNum16(str);
cout<<str<<" : "<<i<<endl;
#else
cout<<"No test case...."<<endl;
#endif
return 0; }
int StrToNum16(const char* str) { if (!IsValidateStr16(str)) { cout<<"Invalidate Num str....."<<endl;
return -1; }
int len = strlen(str); int num = 0;
for (int i = 0;i < len;i++) { num = num*16 + Char16ToInt(str[i]); }
return num; }
int Char16ToInt(char c) { switch (c) { case '0': return 0; break; case '1': return 1; break; case '2': return 2; break; case '3': return 3; break; case '4': return 4; break; case '5': return 5; break; case '6': return 6; break; case '7': return 7; break; case '8': return 8; break; case '9': return 9; break; case 'A': return 10; break; case 'B': return 11; break; case 'C': return 12; break; case 'D': return 13; break; case 'E': return 14; break; case 'F': return 15; break; default: return 0; break; } }
bool IsValidateStr16(const char* str) { if (NULL == str) { return false; }
int len = strlen(str);
for (int i = 0;i < len;i++) { if (!(((str[i] >= '0') && (str[i] <= '9')) || ((str[i] >= 'A') && (str[i] <= 'F')))) return false; } return true; } |