从小函数看应聘者的编程素质(atoi, strcmp…)

在程序员面试的时候,面试官通常会让你实现一个或几个C语言里的库函数,以此来检查你的编程功底。类似的函数实现有atoi.itoa.atof.strcmp.strcpy.memset.memcpy等等。

在平时的编程中,我们可能极少有机会要自己实现这些函数。但是面试官却很喜欢用这些东西考察你。实际上所谓的”考察”,永远是个伪命题。面试者其实不是用这个小函数的实现来考察”你行”,而大部分寄希望于用这个小函数来”你不行”。随便在网上搜搜,,就会发现很多讨论这个的帖子,其中大部分都有一些解答(用来证明你不行的理由),仔细琢磨就会发现其中的有一些还蛮有道理,但有一些解释实在是有点牵强。

说实话,这些函数实现的考察,作用还是有的,但是就我自己感觉,作用还不在单纯的编程能力上,在本文的最后,我会发表我自己的一点看法。还是先说说这些函数的一些实现,都是我自己比较认可的版本,肯定也不一定完全符合面试官的要求,但无论如何,如果我碰到面试官这样考我,我肯定拿下面的答案应付了:)。

首先来看看xtox系列的函数,这类函数涉及数类型和字符类型之间的转换,考察的一个知识点是如何将一个数字转化为对应的字符或者如何将对应的字符转化为数字(以下的代码演示了这些转换方法),在我知道这个方法以前,我都是写个函数,建立字符和数字的对应查询关系(相当于建立了一个数字和字符的查询快表)来匹配两者的对应关系。代码应该来说比较简单,就不加注释了,后文会提到需要额外说明的几点。(特别说明:为篇幅计,下面的代码出现了两行代码出现在一行的情况,真实的代码中可能不希望这样)

——————————————————-atoi———————————————————-

int atoi(const char* str){ int sign = 0,num = 0; assert(NULL != str); while (*str == ‘ ‘) { str++; } if (‘-‘ == *str) { sign = 1; str++; } while ((*str >= ‘0’) && (*str <= ‘9’)) { num = num*10 + (*str – ‘0’); //就是这一行,将对应字符转化为数字

str++; } if(sign == 1) return -num; else return num;}

————————————————-atof————————————————————

double atof(const char* str){ double val = 0.0,power = 0.0; int sign = 0; assert(NULL != str); while (*str == ‘ ‘) { str++; } sign = (*str == ‘-‘)? -1 : 1; if (‘-‘ == *str || ‘+’ == *str) { str++; } while ((*str >= ‘0’)&&(*str <= ‘9’)) { val = val* 10.0 + (*str – ‘0’); str++; } if (‘.’ == *str) { str++; } power = 1.0; while ((*str >= ‘0’)&&(*str <= ‘9’)) { val = val* 10.0 + (*str – ‘0’); power *= 10; str++; } return sign*val/power;}

———————————————itoa————————————————————————

char* itoa(int val,char* buf,unsigned int radix){ char *bufptr; char *firstdig; char temp; unsigned int digval; assert(buf != NULL); bufptr = buf; if (val < 0) { *bufptr++ = ‘-‘; val = (unsigned int)(-(int)val); } firstdig = bufptr; do { digval =(unsigned int) val % radix; val /= radix; if (digval > 9) { *bufptr++ = (char)(digval – 10 + ‘a’); } else { *bufptr++ = (char)(digval + ‘0’); } } while(val > 0); *bufptr– = ‘/0’;//设置字符串末尾,并将指针指向最后一个字符 do //反转字符 { temp = *bufptr; *bufptr = *firstdig; *firstdig = temp; –bufptr; ++firstdig; } while(firstdig < bufptr); return buf;}

———————————————-itoa.end——————————————————————-

你说只有有缘人才可以取下,我看着你手中的戒指,

从小函数看应聘者的编程素质(atoi, strcmp…)

相关文章:

你感兴趣的文章:

标签云: