实现字符串检索strstr函数字符串长度strlen函数字符串拷贝strcpy函数

Posted NoThx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现字符串检索strstr函数字符串长度strlen函数字符串拷贝strcpy函数相关的知识,希望对你有一定的参考价值。

  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函数的主要内容,如果未能解决你的问题,请参考以下文章

字符串和字符函数

字符串和字符函数

字符串和字符函数

strstr的模拟实现

C 库函数 - strstr()

C语言进阶字符函数和字符串函数