对常见的几个函数,周末没事写写,绝对是笔试面试中非频繁,前面n届学长无数次强调了,大家就别怀疑了。从今天开始,每天10道题。
int atoi(const char* str) { if(str==NULL) return 0; bool sigFlag=true; int i=0; int sum=0; while(str[i]!=' ') { if(str[i]=='+') sigFlag=true; else if(str[i]=='-') sigFlag=false; else if(str[i]<='9'&&str[i]>='0') { sum=sum*10+str[i]-'0'; } else { } i++; } if(sigFlag==false) sum=0-sum; return sum; }
以上的有几个要点没注意到,一是没检测溢出,而是没处理好空格,三是诸如a34d5之类的字符串没处理好。
改进后如下:
int atoi(const char* str) { if(str==NULL) return 0; bool sigFlag=true; int i=0; int sum=0; while(str[i]==' ') i++; while(str[i]!=' ') { if(str[i]=='+') sigFlag=true; else if(str[i]=='-') sigFlag=false; else if(str[i]<='9'&&str[i]>='0') { sum=sum*10+str[i]-'0'; if((sigFlag && sum>0x80000000)||(!sigFlag && sum>0x7fffffff )) { sum=0; break; } } else { break; } i++; } if(sigFlag==false) sum=0-sum; return sum; }
itoa:
char* itoa(int inputInt) { if(inputInt<0) inputInt=0-inputInt; int num=inputInt; int i=0; while(inputInt/=10) i++; char* p=new char[i+2]; int j=0; int tmp; do { p[j++]=num%10+'0'; num=num/10; }while(num); p[j+1]=' '; for(int k=0;k<(i+1)/2;++k) { tmp=p[k]; p[k]=p[i-k]; p[i-k]=tmp; } delete []p; return p; }
strcpy:
void Strcpy(char* dstStr,const char* srcStr) { if(srcStr==NULL||srcStr==NULL)return; while(*dstStr++=*srcStr++){} }
memcpy:
void Memcpy(void* pmemTo,const void* pmemFro,int count)
{
if(pmemTo==NULL||pmemFro==NULL) return;
char* pbTo=(char*)pmemTo;
char* pbFro=(char*)pmemFro;
while(count)
{
*pbTo++=*pbFro++;
count--;
}
}
strCmp:
int strCmp(const char* dstStr,const char* srcStr) { assert(dstStr!=NULL&&srcStr!=NULL); while(*dstStr++==*srcStr++ && *dstStr!=' ') return *dstStr-*srcStr; }
二分查找:
int BinarySearch(int* arr,int n,int key) { assert(arr!=NULL); int left,right; left=0; right=n-1; int i=0; int iResult=-1; while(true) { i=(right-left)/2; if(right-left==0) { if(key==arr[left]) { iResult=left; } break; } else if(key>arr[i]) { left=i+1; } else if(key<arr[i]) { right=i-1; } else { iResult=i; break; } } return iResult; }
strcat:
char* StrCat(char* dstStr,const char* srcStr) { char* strResult=dstStr; while(*dstStr++!=' ') {} dstStr--; while(*dstStr++=*srcStr++); return strResult; }