做了一些面试题,有一些是很基础的编程题,如果不假思索的就直接上手写代码的话,如果不是大牛,很可能就栽倒陷阱里了。
其实并不是说题目有多么难,而是作为一个程序员,能不能体现你的思维缜密,考虑问题的全面性。(这样讲的话,一份试题真的能考到心态和能力)
下面是自己写的字符串转换为整数的函数,考虑了五种不同的情况
/*
---------字符串转换为整数(类似与atoi函数)------------
描述:程序本没有那么复杂,如果只是简单的其实不到10行就可以搞定,但是要考虑不同的情况的话,就稍微复杂点。
下面只考虑了简单的五种情况,如果需要添加额外的考虑,可以另行修改代码。
比如“++123 ”也认为是整数,可以转换为123,那么就需要稍微变一下(下述并没有考虑,这种情况直接为0处理)
time:2013.09.14
author: stefen.s
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
void StrToInt(const char *str)
{
//-----第一种情况:str为null
if(str == NULL)
{
cout<<"string is null."<<endl;
return;
}
//-----第二种情况:str为""
int count = strlen(str);
if(count<1)
{
cout<<"invalid string."<<endl;
return;
}
int sign = 1; //默认为正数,符号标量为1
//-----第三种情况:str的第一项为符号“+ ” 或者“- ”
sign = ('-' == str[0]?-1:1);
int num = 0;
for(int i = 0;i<count;i++)
{
int temp = str[i] - 0x30;
//-----第四种情况:存在其他字符在数字中间的情况,只保留该字符前面的数字为所取的数字
if(i>=1 && (temp < 0 || temp > 9))
break;
//-----第五种情况:正常情况(包括“000123 ”这种前面有很多零的情况
if(temp >=0 && temp <= 9)
num = temp + num * 10;
}
cout<<"String to integer is : "<<(num * sign)<<endl;
}
int main()
{
char * str = "++123456";
StrToInt(str);
//-----和atoi进行对比
cout<<"atoi: "<<atoi(str)<<endl;
return 0;
}
接下来是字符串拷贝函数,同样考虑了五种不同的情况。比较容易忽略的是第四种情况
char *StrCpy(char *to,const char * src)
{
//------第一种情况,src为null
assert(to != NULL && src != NULL);
char *d = to;
int count = strlen(s) + 1; //保证将最后的'\0'也复制上
//-----第二种情况,src = ""
if(count<1)
{
cout<<"Empty string."<<endl;
return;
}
//-----第三种情况,d==src
if(d ==src)
return d;
//-----第四种情况,d在src和src+count之间-----这种情况容易忽视
if(d > src && d <=(src + count))
{
d = to + count;
src = src + count;
while(count--)
*d-- = *src--;
}
//-----第五种情况,d<src或者d>src + count
else
while((*d++ = *src++) != '\0');
return to; //注意返回值
}