实现字符串检索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 }

原文地址:https://www.cnblogs.com/nothx/p/8543565.html

时间: 2024-10-13 11:32:05

实现字符串检索strstr函数、字符串长度strlen函数、字符串拷贝strcpy函数的相关文章

C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出【转】

本文转载自;http://www.cnblogs.com/easyfrog/archive/2011/12/26/C_strstr_split_string.html C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: 下面的这个例子是实现 字符串以分割串分割输出: 1 #include <stdio.h> 2 #include <strin

用C语言编写函数,实现strlen计算字符串长度的功能

本文介绍三种方法: 1.循环计数法,(设置一个计数器). 2.递归法,(函数调用自身进行计算) 3.指针-指针法,(库函数使用的是此方法) 现在列入程序: 方法1: /* 计数法 */ int my_strlen(char *p) { int number = 0; while (*p) { number++; p++; } return number; } 方法2: /* 递归法 */ int my_strlen(char *str1) { if (*str1 != '\0') { str1+

华为训练题目:初级——字符串最后一个单词的长度

初级 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度,单词以空格隔开. 知识点 字符串,循环 运行时间限制 0M 内存限制 0 输入 一行字符串,长度小于128. 输出 整数N,最后一个单词的长度. 样例输入 hello world 样例输出 5 思路:这道题字符串可能中间有空格,可能后面最后有空格. 先将下标从后往前指到最后一个不是空字符的方,再开始计数 1 #include<iostream> 2 #include<string> 3 using namespac

strlen、ord、substr函数——获取长度、ASCII码及部分字符串

strlen函数 语法:strlen(string) 定义和用法:strlen() 函数返回字符串的长度. substr函数 语法:substr(string,start,length) 定义和用法:substr() 函数返回字符串的一部分. 参数描述 string:必需.规定要返回其中一部分的字符串. start:必需.规定在字符串的何处开始.正数,在字符串的指定位置开始:负数,在从字符串结尾的指定位置开始:0,在字符串中的第一个字符处开始. charlist:可选.规定要返回的字符串长度.默

内存及字符串操作篇strlen strchar strcmp strcoll strcpy strdup strstr strtok strspn strrchr bcmp bcopy bzero index memccpy memset

bcmp(比较内存内容) 相关函数 bcmp,strcasecmp,strcmp,strcoll,strncmp,strncasecmp 表头文件 #include<string.h> 定义函数 int bcmp ( const void *s1,const void * s2,int n); 函数说明 bcmp()用来比较s1和s2所指的内存区间前n个字节,若参数n为0,则返回0. 返回值 若参数s1 和s2 所指的内存内容都完全相同则返回0 值,否则返回非零值. 附加说明 建议使用memc

PHP截取字符串,获取长度,获取字符位置的函数

strstr(string,string) = strchr(,) //从前面第一次出现某个字符串的地方截取到最后strrchr(string,string) //从某个字符串从最后出现的位置截取到结尾strpos(string,string[,int]) //某个字符串第一次出现的位置strrpos(string,string) //某个字符串最后一次出现的位置substr(string,int[,int]) //从指定位置开始截取字符串,可以指定截取的长度.strlen(string) //

长度受限的字符串函数及其他字符串函数

长度受限的字符串函数:这下函数接受一个显示的长度做参数,用于限定比较或复制的字符数,防止一些长字符串从目标数组中溢出. 三中常见的受限字符串函数: char * strncpy(char *dst,char const *src,size_t len); strncpy从src中复制len个字符到dst中,如果strlen(src)的长度小于len,则多出来的字符用NUL填补,注意,当strlen(src)大于或者等于len,strncpy不会以NUL结尾,所以使用strncpy时要慎重考虑.

字符串s中从第i个位置起取长度为len的子串,函数返回子串链表

/*已知字符串采用带结点的链式存储结构(详见linksrting.h文件),请编写函数linkstring substring(linkstring s,int i,int len),在字符串s中从第i个位置起取长度为len的子串,函数返回子串链表.*/ #include "linkstring.h"/*请将本函数补充完整,并进行测试*/linkstring substring(linkstring s, int i, int len){linkstring temp;int j;fo

求字符串长度 strlen(数组指针两种方式)

问题: 求字符串中所含有字符的个数(包括空格),即求字符串长度: #include <stdio.h> #include <assert.h> int _strlen(const char* str) { assert(str != NULL); int i=0; for(;*str++!='\0';i++); //for(;str++!=NULL;i++);//有些说这句也可以,但执行结果是死循环,str++即使越界也未必为NULL; return i; } int _strle