(C/C++學習)14.C語言字串處理函式(二)
阿新 • • 發佈:2018-11-10
說明:上節著重解釋了字串處理的庫函式處理,這節將針對一些常用的需求,進行非庫函式的處理。
一.去除某一個字串中的某個字元
1.去除字串右邊的空格
1 void trimStrRightSpace(char * str) 2 { 3 while(*str) 4 str++; 5 while(*(--str) == ' ') 6 *str = '\0'; 7 }
2.去除字串左邊的空格
1 void trimStrLeftSpace(char * str) 2 { 3 char *t= str; 4if(*t != ' ' ) 5 return; 6 while(*t ==' ') 7 t++; 8 while((*str++ = *t++)) 9 ; 10 }
3.去除所有的空格
1 void trimStrSpace(char *str) 2 { 3 char *t = str; 4 while(*str) 5 { 6 if(*str != ' ') 7 *t++ = *str; 8 str++; 9} 10 *t='\0'; 11 }
值得注意的是,可以將上述程式碼中的空格替換成任意單個字元以實現對某個字串去掉所有的某個字元的功能,並且可以將最終的字串返回,如下程式碼:
1 char* charremove(char *p) 2 { 3 char *t = p; 4 char *q = p; 5 while(*t) 6 { 7 if(*t != ' ' && *t != '\t') 8 //去除某段字串中的任意字元 9 *p++ = *t; 10t++; 11 } 12 *p = '\0'; 13 return q; 14 }
二.字串的翻轉
方案1:
1 void reverse(char *str) 2 { 3 char *start = str; 4 char *end = start + strlen(str)-1; 5 while(start < end) 6 { 7 *start = *start ^*end; 8 *end = *start ^*end; 9 *start = *start ^*end; 10 start++; 11 end--; 12 } 13 }
方案2:
1 void reverse(char *str,char*buf) 2 { 3 if(*str == '\0') 4 return; 5 reverse(str+1,buf); 6 strncat(buf,str,1); 7 }
三.隨機字串的生成
1 string generatestring() 2 { 3 string str1; 4 string str("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"); 5 int c = (rand()%62); 6 cout<<c<<endl; 7 //列印生成字串中的字元個數 8 for(int i = 0;i < c;i++) 9 { 10 int d = rand()%62; 11 str1 += str[d]; 12 } 13 return str1; 14 }
如下,要求隨機生成 10 個字串,並對其進行排列,排列規則由 cmp 函式決定(以ASCII 值得大小進行比較)。需要注意的是,利用上述函式生成隨機字串時需要在主函式中呼叫隨機函式種子。
1 #include <iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<time.h> 5 using namespace std; 6 7 string generatestring() 8 { 9 string str1; 10 string str("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"); 11 int c = (rand()%62); 12 cout<<c<<endl; 13 for(int i = 0;i < c;i++) 14 { 15 int d = rand()%62; 16 str1 += str[d]; 17 } 18 return str1; 19 } 20 21 bool cmp(string a, string b) 22 { 23 return a < b; 24 } 25 26 int main() 27 { 28 srand(time(NULL)); 29 string str1,str2; 30 vector<string> vec(10); 31 generate(vec.begin(),vec.end(),[](){return generatestring();}); 32 sort(vec.begin(),vec.end(),cmp); 33 for(string it:vec) 34 cout<<it<<"\n"; 35 return 0; 36 } 37檢視程式碼