字符串类常见面试大题
1,strlen函数的实现
//题目一:strlen函数的实现 //1,注意异常抛出 //2,注意蒋行参用const来修饰 int strlen(const char* str){ int len=0; while(*str++!='\0'){ len++; } return len; }
2,strcpy函数的实现
//题目二:strcmp函数的实现 int strcmp(const char* str1,const char* str2){ assert(str1!=NULL&&str2!=NULL); int i; while((*str1)!='\0'&&(*str2)!='\0'){ if((*str1)==(*str2)){ str1++; str2++; }else{ break; } } if((*str1)=='\0'&&(*str2)=='\0'){ return 0; }else{ return (*str1)>(*str2)?1:-1; } }
3,strcpy函数实现
(这个能写的特别精炼的)
//题目三:strcpy函数的实现 //1,链式反映 //2,注意最后的'\0'需不需要单独赋值 char* strcpy(char* strDes, const char* strSrc){ assert(strDes!=NULL&&strSrc!=NULL); char * adress=strDes; while(((*strDes++)=(*strSrc))!='\0'); return adress; }
4,strcat函数实现
//题目四:strcat函数的实现 char* strcat(char* strDes,const char* strSrc){ assert(strDes!=NULL&&strSrc!=NULL); char* address=strDes; while((*strDes)!='\0'){ strDes++; } while(((*strDes++)=(*strSrc++))!='\0'); return address; }
5,字符串转换为数字
//题目五,蒋字符串转换为数字 //1,注意非空 //2,注意正负 //3,注意非法,返回-1 //4,注意溢出,返回-2 int str2num(const char* str){ assert(str!=NULL); const char* p=str; bool minus=false; long long result=0; if(*p=='-'){ minus=true; p++; }else if(*p=='+'){ p++; } while(*p!='\0'){ if(*p<'0'||*p>'9'){ return -1; } result=result*10+((*p)-'0'); if(result>std::numeric_limits<int>::max()){ //说明溢出 return -2; } p++; } minus=true?-result:result; return result; }
6,一个字符串abaaaabbab&#%,删除其中的符合下列条件的三元组(第一个字母和第三个字母相等,但和第二个字母不相等)如删除aba,但不删除aaa。求剩下的字符串
错误思路:用三个指针指向相邻的三个元素,从后往前依次扫描和移动
错误原因:删除的同时更改了字符串原来的属性
正确思路:利用辅助的标记数组,首先扫描一遍字符串,将接下来想要删除的位置进行标记,之后删除即可。