1. 程式人生 > >38.C語言字符串總結

38.C語言字符串總結

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語言字符串總結