zoukankan      html  css  js  c++  java
  • 实现字符串检索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 != '')
     66     {
     67         int flag = 1;  // 假定相等
     68         char *pfind = pbak; // 从当前字符循环母串
     69         char *psub = _Substring; // 从当前字符循环子串
     70         while (*psub != '')
     71         {
     72             if (*pfind != '') // 母串提前结束
     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) == '')  //下标法 *(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] == '')
    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] == '')
    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 != ''; 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
    ", 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) == '')
    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
    ", mystrcpyaddr(str, p));
    53     int x = 10, y = -3;
    54     
    55 
    56 
    57     //printf("x %% y = %d
    ", x%y);
    58 
    59     system("pause");
    60 }
  • 相关阅读:
    c语言练习24——数列求和
    Excel 常用属性的一小部分
    常见问题一之拼接表格 js传递参数变量 Json接收值
    关于下拉列表HtmlDownlistFor的使用
    Quay 基础版安装和部署
    Prometheus使用blackbox_exporter监控端口及网站状态(七)
    在CentOS 8上安装PostgreSQL 13 | RHEL 8
    nfs配置以及No route to host解决
    LNMP分离安装
    Linux配置和管理设备映射多路径multipath
  • 原文地址:https://www.cnblogs.com/nothx/p/8543565.html
Copyright © 2011-2022 走看看