實現字符串檢索strstr函數、字符串長度strlen函數、字符串拷貝strcpy函數
阿新 • • 發佈:2018-03-11
OS return fin ddr 如何 每一個 spa 不足 bre
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 /* 6 _Check_return_ _Ret_maybenull_ 7 inline char* __CRTDECL strstr(_In_z_ char* const _String, _In_z_ char const* const _SubString) 8 { 9 return const_cast<char*>(strstr(static_cast<char const*>(_String), _SubString));10 } 11 */ 12 13 /* 14 對於字符串查找問題,可使用雙重 for 循環解決, 15 效率更高的則為 KMP 算法。雙重 for 循環的使用較有講究, 16 因為這裏需要考慮目標字符串比源字符串短的可能。 17 對目標字符串的循環肯定是必要的,所以可以優化的地方就在於如何訪問源字符串了。 18 簡單直觀的解法是利用源字符串的長度作為 for 循環的截止索引, 19 這種方法需要處理源字符串中剩余長度不足以匹配目標字符串的情況, 20 而更為高效的方案則為僅遍歷源字符串中有可能和目標字符串匹配的部分索引。 21 22 */ 23 char *mystrstr1(char* const _String, char const* const _Substring)// 下標法 24 { 25 if (_String == NULL || _Substring == NULL) 26 { 27 return NULL; 28 } 29 char *pres = NULL; 30 int strLength = strlen(_String); // 母串的長度 31 int subLength = strlen(_Substring); // 子串的長度 32 33 for (int i = 0; i < strLength - subLength + 1; i++)// 獲取要前進的尺度 34 { 35 int flag = 1; // 假定相等 36 for (int j = 0; j < subLength; j++) 37 { 38 39 if (_Substring[j] != _String[i+j])// 循環對比 40 { 41 flag = 0; 42 break; 43 } 44 } 45 if (flag) 46 { 47 pres = _String + i; // 找到的地址 48 return pres; 49 } 50 } 51 52 return pres; 53 54 } 55 56 57 58 char *mystrstr2(char * const _String, char * const _Substring)// 指針法 59 { 60 if (_String == NULL || _Substring == NULL) 61 { 62 return NULL; 63 } 64 char *pbak = _String; // 備份首地址 65 while (*pbak != ‘\0‘) 66 { 67 int flag = 1; // 假定相等 68 char *pfind = pbak; // 從當前字符循環母串 69 char *psub = _Substring; // 從當前字符循環子串 70 while (*psub != ‘\0‘) 71 { 72 if (*pfind != ‘\0‘) // 母串提前結束 73 { 74 if (*pfind != *psub) // 判斷字符串不等 75 { 76 flag = 0; 77 break; 78 } 79 else 80 { 81 pfind++; 82 psub++; // 指針往前移動 83 } 84 } 85 else 86 { 87 flag = 0; 88 break; 89 } 90 } 91 if (flag) 92 { 93 return pbak; // 保存當前地址 94 } 95 96 pbak++; // 指針不斷向前移動,遍歷母串的每一個字符 97 } 98 99 return NULL; 100 101 } 102 103 104 void main() 105 { 106 char str[100] = "hello,NoThx"; 107 char sub[40] = "x"; 108 109 //char *p = strstr(str, sub); 110 char *p = mystrstr1(str, sub); 111 //char *p = mystrstr2(str, sub); 112 if (p != NULL) 113 { 114 115 printf("找到 %p %c", p, *p); 116 } 117 else 118 { 119 printf("沒找到"); 120 } 121 122 123 system("pause"); 124 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 /* size_t __cdecl strlen(_In_z_ char const* _Str); */ 6 7 // 下標法 8 unsigned int mystrlen(const char * str) 9 { 10 int length = 0; 11 /* for循環 12 for (int i = 0;;i++) 13 { 14 if (*(str + i) == ‘\0‘) //下標法 *(str + i) <==> str[i] 15 { 16 break; 17 } 18 length++; 19 } 20 21 */ 22 /* while循環 23 int i = 0; 24 while (1) 25 { 26 27 if (str[i] == ‘\0‘) 28 { 29 break; 30 } 31 else 32 { 33 length++; 34 i++; 35 } 36 } 37 38 */ 39 40 int i = 0; 41 do 42 { 43 if (str[i] == ‘\0‘) 44 { 45 break; 46 } 47 else 48 { 49 length++; 50 i++; 51 } 52 } while (1); 53 54 return length; 55 } 56 57 unsigned int mystrlenaddr(const char * str)// const說明只能讀取,不能改變 58 { 59 int length = 0; 60 for (const char *p = str; *p != ‘\0‘; p++) 61 { 62 length++; 63 } 64 65 return length; 66 } 67 68 void main() 69 { 70 char *str = "afasfa"; 71 72 //int lenth = mystrlen(str); 73 int lenth = mystrlenaddr(str); 74 75 printf("%d\n", lenth); 76 77 78 79 system("pause"); 80 }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 /* 6 _ACRTIMP errno_t __cdecl strcpy_s( 7 _Out_writes_z_(_SizeInBytes) char* _Destination, 8 _In_ rsize_t _SizeInBytes, 9 _In_z_ char const* _Source 10 ); 11 */ 12 13 char *mystrcpy(char *dest, const char *source) 14 { 15 if (dest == NULL || source == NULL) 16 { 17 return NULL; 18 } 19 for (int i = 0; ; i++)// 下標法 20 { 21 dest[i] = source[i]; 22 if (*(source + i) == ‘\0‘) 23 { 24 break; 25 } 26 27 } 28 return dest; 29 } 30 31 char *mystrcpyaddr(char *dest, const char *source) 32 { 33 if (dest == NULL || source == NULL) 34 { 35 return NULL; 36 } 37 char *phead = dest; 38 39 while ((*dest++ = *source++)) 40 { 41 42 } 43 return phead; 44 } 45 46 void main() 47 { 48 char str[100] = { 0 }; 49 char *p = "hello,how are you"; 50 //strcpy_s(str, 100, p); // 字符串拷貝 51 52 printf("%s\n", mystrcpyaddr(str, p)); 53 int x = 10, y = -3; 54 55 56 57 //printf("x %% y = %d\n", x%y); 58 59 system("pause"); 60 }
實現字符串檢索strstr函數、字符串長度strlen函數、字符串拷貝strcpy函數