近期的第一场面试,一言以蔽之:“准备的都没问,问的刚好?”,不是太难,还是复习的不全面,打击才刚刚开始,越挫越奋,加油!
1.自我介绍,聊了一会项目
2.拷贝构造函数(浅拷贝和深拷贝)
这个问题,C++拷贝构造函数详解一文讲得比较清楚了,基本上和c++ primer plus中相关部分差不多,值得一瞧!
又顺带问了下c++里的动态内存分配,这也是个经典的老问题了。
4.atoi(即 alphanumeric to integer)函数的实现
再常见不过的题,很久之前在leetcode上刷过此题(参见:),不过全程使用string。很久没做,今天要求使用原型的形式:int atoi(const char *nptr),还有点想不起来,做的不太好,考虑不全(?)!!
注意的点:
1.字符串所表示数字的正负号
2.结束条件:遇到非数字或者结束符‘\0’
3.考虑字符串前的空白,直到遇到数字或正负号才开始转换
4.判断是否溢出:分别与int表示的最大值和最小值比较,根据正负返回INT_MAX和INT_MIN
5.如果字符串不含有效参数,如:全是空格或字母等,返回0
#include<iostream>
int atoi(const char *str) {
if(str == NULL || strlen(str) <=0)
return 0;
bool negative = false;
while(*str == ' ') ++str;
if(*str == '-'){
negative = true;
++str;
}
if(*str == '+') ++str;
long long res = 0;
while(*str!='\0'){
if( *str>='0' && *str<='9') {
res = res*10 + *str - '0';
} else {
break;
}
++str;
}
res = negative ? -res : res;
if(res>INT_MAX) return INT_MAX;
else if(res<INT_MIN) return INT_MIN;
else return res;
}
int main(){
//注意输入,char *str里str只是一个字符串指针,只是存储一个字符串指针变量,要想用cin输入字符串,必须声明字符数组。
char* str;
char a[20];
str=a;
/*循环输入
while(std::cin>>str){
int res=atoi(str);
std::cout<<res<<std::endl;
}
*/
std::cin>>str;
int res=atoi(str);
std::cout<<res<<std::endl;
return 0;
}
还可参考下:http://blog.csdn.net/feliciafay/article/details/17111231
判断溢出时如果先不加符号,可以这么写(当然还是上面的简洁):
if(negative && res > INT_MAX+1LL){
return INT_MIN;
}
else if(!negative && res > INT_MAX){
return INT_MAX;
}
顺便谈下Sizeof与Strlen的区别吧:
各种输入的形式:
C++ 输入函数getline(cin,str) 与cin.getline(str,int)区别
拓展: char*,const char*和string 三者转换