字符串處理函數(不使用庫函數實現) 分類: C/C++ int strlen1(const char *str); char *del_char(char *str,char c); char *delete_string(char *str,int pos,int len); const char *strstr1(const char *src,const char *sub); char *strchr1( char *str, char ch ); int chrcnt1(const char *src,char ch); char *strpbk(char const *s,char const *accpet); char *strcpy1(char *Dest,const char *source); char *strncpy1(char *Dest,const char *source,int len); void *memcpy1(void* dst,const void* src,size_t count); void *memmove1(void* dst,const void* src,size_t count); char *strcat1(char *dest,const char *src); char *strncat1(char *dest, const char* src,int num); void sort1(char *src,int num); char *strrv1(const char *str); char *strrv2(const char *str); char *strrv3(char *str,int len); void revstr(char *src); int isRevstr(char *str);//判斷是否爲迴文level void loopMove(char *src,int n); char *loopmove(char *str, int num); ////////////////////////////////////////////////////////////////////////////////// //計算字符串的長度 int strlen1(const char *str) { int len=0; while (*str++!='\0') len++; return len; /*字符串長度較長時該方法比上面(自增兩次)的效率要高 **const char *temp=str;//保存src的首地址 **while(*src++!='\0');//自增一次 **return (src-temp-1);//返回尾部指針與頭部指針之差,即長度 */ } //////////////////////////////////////////////////////////////////////////////// //刪除字符串中全部指定的字符 //定義兩個指針,head指針作記錄使用,p作字符串遍歷使用; char *del_char(char *str,char c) { char *head=NULL; char *p=NULL; if (str==NULL) { return NULL; } head=p=str; while(*p) { if(*p!=c) { *str++=*p; } p++; } *str='\0'; return head; } ////////////////////////////////////////////////////////////////////////////// //從字符串指定位置開始,刪除其指定長度的字符 //首先檢查pos和len的合法性,而後找到pos位置,刪除len個字符 char *delete_string(char *str,int pos,int len) { char *p=str+pos-1;//指向pos位置的字符 int strlen=strlen1(str);//自定義方法 //int str_len=strlen(str);//字符長度庫函數 if ((pos<1)||(p-str)>strlen)//檢查pos是否不大於1,或pos超出字符串長度 { return str; } if ((p+len-str)>strlen)//len大於pos後剩餘的字符個數的話,只需對pos位置賦'\0' { *p='\0'; return str; } while (*p && *(p+len))//len小於或等於pos後剩餘的字符個數刪除len個字符 { *p=*(p+len); p++; } *p='\0'; return str; } /////////////////////////////////////////////////////////////////////////////// //字符串中字串的查找strstr庫函數的實現 const char *strstr1(const char *src,const char *sub) { const char *bp; const char *sp; if (src==NULL || sub==NULL)//檢查src和sub的有效性 { return src; } while (*src) { bp=src; sp=sub; do { //遍歷sub字符串 if(!*sp) //若是到了sub字符串結束位置,退出 return src; } while (*bp++==*sp++); src+=1; } return NULL; } ///////////////////////////////////////////////////////////////////////////// //strchr()函數返回一個指向str中ch首次出現的位置,當沒有在str中找ch時返回NULL。 char *strchr1(char *src, char ch ) { while((*src!=ch)&&(*src)) src++; return (src); } //////////////////////////////////////////////////////////////////////////////// //chrcnt(), 計算某個字符在字符串中出現的次數. int chrcnt1(const char *src,char ch) { int count=0; while(*src) if(*src==ch) count++; return count; } ///////////////////////////////////////////////////////////////////////// //該函數返回一個指向str中第一個匹配的group中任何一個字符的字符位置.若無則返回空(NULL). char *strpbk(char const *s,char const *accpet) { while(*s != '\0') { while(*accpet != '\0') if(*accpet++ == *s) return (char *)s; ++s; } return NULL; } //////////////////////////////////////////////////////////////////////////////// //字符串複製 char *strcpy1(char *Dest,const char *source) { char *srcDest=Dest;//保存目標字符串的首地址 /* while( *source !='\0') *Dest++ = *source++; *Dest = '\0'; //寫法1 */ while((*Dest++=*source++)!='\0'); return srcDest; } ///////////////////////////////////////////////////////////////////////// //指定長度的字符串複製 char *strncpy1(char *Dest,const char *source,int len) { char *srcDest=Dest;//保存目標字符串的首地址 while( *source !='\0' && len--) *Dest++ = *source++; *Dest = '\0'; return srcDest; } //////////////////////////////////////////////////////////////////////////// //內存複製的實現拷貝不重疊的內存塊 void* memcpy1(void* dst,const void* src,size_t count) { char* pbTo = (char*)dst; char* pbFrom = (char*)src; assert(dst!= NULL && src != NULL);//不能存在空指針 assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止內存重疊(overlap) while (count-- > 0) { *pbTo++ = *pbFrom++; } return dst; } ////////////////////////////////////////////////////////////////////////// //memmove實現移動一塊字節,src源數據能夠不保留 void* memmove1(void* dst,const void* src,size_t count) { char* pbTo = (char*)dst; char* pbFrom = (char*)src; assert(dst != NULL && src != NULL);//不能存在空指針 if (dst <= src || pbTo >= pbFrom + count)//沒有overlap的狀況,直接拷貝 { while (count-- > 0) { *pbTo++ = *pbFrom++; } } else { pbTo = pbTo + count -1;//overlap的狀況,從高位地址向低位拷貝 pbFrom = pbFrom + count -1; while (count-- > 0) { *pbTo-- = *pbFrom--; } } return dst; } ///////////////////////////////////////////////////////////////// //memset:把buffer所指內存區域的前count個字節設置成字符c void * Memset(void* buffer, int c, int count) { char* pvTo=(char*)buffer; assert(buffer != NULL); while(count-->0) *pvTo++=(char)c; return buffer; } ///////////////////////////////////////////////////////////////////////////// //字符串比較strcmp庫函數的實現 int strcmp1(const char *src,const char *dst) { int ret; while (!(ret=*(unsigned char *)src-*(unsigned char *)dst)&& *dst)//循環比較兩個字符是否相等 { ++src; ++dst; } if(ret<0) ret=-1; else if(ret>0) ret=1; return (ret); } ///////////////////////////////////////////////////////////////////////// //鏈接兩個字符串strcat庫函數的實現 char *strcat1(char *dest,const char *src) { char *temp = dest; while (*dest != '\0') dest++; while((*dest++ = *src++) != '\0'); return temp; } //////////////////////////////////////////////////////////////////////////// ////鏈接兩個字符串的指定個數strncat庫函數的實現 char *strncat1(char *dest, const char* src,int num) { char *temp = dest; while (*dest != '\0') dest++; while((*dest++ = *src++) != '\0' && num--); return temp; } //////////////////////////////////////////////////////////////////////////// //字符串的排序與交換 冒泡。。 void sort1(char *src,int num) { int i,j; int tmp=0; for (i=0;i { for (j=i+1;j { tmp=src[i]; src[i]=src[j]; src[j]=tmp; } } } ////////////////////////////////////////////////////////////////////////// //字符串的反轉 char *strrv1(const char *str) { int i; int len=strlen(str); char c; char *tmp=new char[len+1]; strcpy(tmp,str); for(i=0;i { c=tmp[i]; tmp[i]=tmp[len-i-1]; tmp[len-i-1]=c; } return tmp; } //指針實現 char *strrv2(const char *str) { char c; char *tmp=new char[strlen(str)+1]; strcpy(tmp,str); char *ret=tmp; char *p=tmp+strlen(str)-1; while (p>tmp) { c=*tmp; *tmp=*p; *p=c; --p; ++tmp; } return ret; } //遞歸實現 char *strrv3(char *str,int len) { if (len<=1) return str; char t=*str; *str=*(str+len-1); *(str+len-1)=t; return (strrv3(str+1,len-2)-1); } /////////////////////////////////////////////////////////////////////// //反轉abcdefgh 但不改變單詞的內部結構 void revstr(char *src) { char *start=src,*end=src,*ptr=src; while (*ptr++ !='\0') { if (*ptr==' '|| *ptr=='\0') { end=ptr-1;//end指向單詞末尾 while(start swap(*start++,*end--);//把單詞的字母逆置 start=end=ptr+1;//指向下一個單詞的開頭 } } start=src,end=ptr-2;//start指向開頭,end指向末尾 while (start { swap(*start++,*end--);//把整個字符串逆置 } } ////////////////////////////////////////////////////////////////////// //判斷是否爲迴文level int isRevstr(char *str) { int i,len; int found=1; if (str==NULL) { return -1; } len=strlen(str); for (i=0;i { if(*(str+i)!=*(str+len-i-1)) { found=0; break; } } return found; } ///////////////////////////////////////////////////////////////////////// //字符串循環右移 void loopMove(char *src,int n) { int i=0; char *tmp=NULL; int strlen=0; char *head=src; while (*src++) strlen=src-head-1; n=n%strlen; tmp=(char*)malloc(n); for (i=strlen-1;i { tmp[i]=head[strlen-n+i]; } for (i=strlen-1;i>=n;i--) { head[i]=hean[i-n]; } for (i=0;i { head[i]=tmp[i]; } free(tmp); } //////////////////////////////////////////////////////////////////////// //字符串右移 (不使用庫函數實現) char *loopmove(char *str, int num) { char temp[100]=""; int i = 0; int len = 0; //求長度 for(i=0;str[i]!=0;i++) len++; //保存最後num個字符 for(i=0;i { temp[i] = str[len-num+i]; } //將前 len-num個字符向後移動num個字節 for(i=0;i { str[len-1-i] = str[len-1-i-num] ; } //將保存的後num個字符放在str最前面 for(i=0;i { str[i] = temp[i]; } return str; }