38.C語言字符串總結
阿新 • • 發佈:2018-01-23
length 轉化 system 控制 put () pre rcp c語言
1.自己實現三個常用函數 strlen,strcpy,strstr
自己實現strstr函數,如果找到返回首地址,找不到則返回NULL
1 //查找元素,返回首地址 2 char *mystrstr(const char *_Str,const char *_SubStr) 3 { 4 //如果有一個為空,則返回NULL 5 if (_Str == NULL || _SubStr == NULL) 6 { 7 return NULL; 8 } 9 10 //psrc,psub保存源字符串和子字符串當前查詢到的地址 11 char*psrc = _Str; 12 char *psub = _SubStr; 13 14 //如果源字符串沒有遍歷晚,則繼續遍歷 15 while (*psrc != ‘\0‘) 16 { 17 //創建新的臨時地址,保存當前遍歷到的地址 18 char *ptmp_src = psrc; 19 char *ptmp_sub = psub; 20 int flag = 1;//首先假設字符串找到 21 //如果自字符串沒有遍歷完,則繼續遍歷 22 while (*ptmp_sub != ‘\0‘) 23 { 24 //如果源字符串提前結束,則返回NULL 25 if (*ptmp_src == ‘\0‘) 26 { 27 return NULL; 28 } 29 //如果當前遍歷到的不相等,則flag置0,跳出循環 30 if (*ptmp_src != *ptmp_sub) 31 { 32 flag = 0; 33 break; 34 } 35 else//否則同時向後移動一位 36 { 37 ptmp_src++; 38 ptmp_sub++; 39 } 40 } 41 //如果找到了返回首地址 42 if (flag) 43 { 44 return psrc; 45 } 46 //如果沒找到源字符串向後移動一位,再進行遍歷 47 psrc++; 48 } 49 50 return NULL; 51 }
自己實現strlen函數
1 unsigned int mystrlen(const char *str) 2 { 3 int length = 0; 4 for (int i = 0;; i++) 5 { 6 if (*(str + i) == ‘\0‘) 7 { 8 break; 9 } 10 length++; 11 } 12 return length; 13 }
自己實現strcpy函數
1 char *mystrcpy(char *dest, const char *source) 2 { 3 if (dest == NULL || source == NULL) 4 { 5 return NULL; 6 } 7 for (int i = 0;; i++) 8 { 9 dest[i] = source[i]; 10 if (*(source + i) == ‘\0‘) 11 { 12 break; 13 } 14 15 return dest; 16 } 17 }
2.字符串的排序以及自己實現strcmp
字符串的排序調用qsort
1 int compare(const void *p1, const void *p2)//傳遞的是數組元素的地址,類型是**,要先轉化為**的指針 2 { 3 const char **pstr1 = p1; 4 const char **pstr2 = p2; 5 //去每個元素首地址比較兩個字符串 6 return strcmp(*pstr1, *pstr2); 7 } 8 9 void main() 10 { 11 char *str[10] = { "calc","apple","run","123" ,"boat","dead","father","son","hello","2018"}; 12 qsort(str, 10, 4, compare); 13 for (int i = 0; i < 10; i++) 14 { 15 puts(str[i]); 16 } 17 system("pause"); 18 }
字符串的排序,冒泡法
1 void main() 2 { 3 char str[10][10] = { "calc","apple","run","123" ,"boat","dead","father","son","hello","2018" }; 4 5 for (int i = 0; i < 10 - 1; i++)//控制次數 6 { 7 for (int j = 0; j < 10 - i - 1; j++)//兩個兩個比較,大數沈底 8 { 9 if (strcmp(str[j], str[j + 1]) > 0) 10 { 11 char strtemp[100] = { 0 }; 12 strcpy(strtemp, str[j]); 13 strcpy(str[j], str[j + 1]); 14 strcpy(str[j + 1], strtemp); 15 } 16 17 } 18 } 19 for (int i = 0; i < 10; i++) 20 { 21 puts(str[i]); 22 } 23 system("pause"); 24 }
自己實現strcmp
1 int mystrcmp(const char * _Str1, const char * _Str2) 2 { 3 if (_Str1 == NULL || _Str2 == NULL) 4 { 5 return 0; 6 } 7 char *pstr1 = _Str1; 8 char *pstr2 = _Str2; 9 //一直循環到兩個字符不相等 10 while (*pstr1 == *pstr2 && *pstr1 != ‘\0‘) 11 { 12 pstr1++; 13 pstr2++; 14 } 15 //如果都到兩個字符串結尾 16 if (*pstr1 == ‘\0‘ && *pstr2 == ‘\0‘) 17 { 18 return 0; 19 } 20 //如果有一個到結尾 21 else if (*pstr1 == ‘\0‘ && *pstr2 != ‘\0‘) 22 { 23 return -1; 24 } 25 else if (*pstr1 != ‘\0‘ && *pstr2 == ‘\0‘) 26 { 27 return 1; 28 } 29 //如果都沒到結尾 30 else 31 { 32 return *pstr1 > *pstr2 ? 1 : -1; 33 } 34 }
38.C語言字符串總結