#include <stdio.h>
#include <stdlib.h>
#include <string.h> /*
_Check_return_ _Ret_maybenull_
inline char* __CRTDECL strstr(_In_z_ char* const _String, _In_z_ char const* const _SubString)
{
return const_cast<char*>(strstr(static_cast<char const*>(_String), _SubString));
}
*/ /*
对于字符串查找问题,可使用双重 for 循环解决,
效率更高的则为 KMP 算法。双重 for 循环的使用较有讲究,
因为这里需要考虑目标字符串比源字符串短的可能。
对目标字符串的循环肯定是必要的,所以可以优化的地方就在于如何访问源字符串了。
简单直观的解法是利用源字符串的长度作为 for 循环的截止索引,
这种方法需要处理源字符串中剩余长度不足以匹配目标字符串的情况,
而更为高效的方案则为仅遍历源字符串中有可能和目标字符串匹配的部分索引。 */
char *mystrstr1(char* const _String, char const* const _Substring)// 下标法
{
if (_String == NULL || _Substring == NULL)
{
return NULL;
}
char *pres = NULL;
int strLength = strlen(_String); // 母串的长度
int subLength = strlen(_Substring); // 子串的长度 for (int i = ; i < strLength - subLength + ; i++)// 获取要前进的尺度
{
int flag = ; // 假定相等
for (int j = ; j < subLength; j++)
{ if (_Substring[j] != _String[i+j])// 循环对比
{
flag = ;
break;
}
}
if (flag)
{
pres = _String + i; // 找到的地址
return pres;
}
} return pres; } char *mystrstr2(char * const _String, char * const _Substring)// 指针法
{
if (_String == NULL || _Substring == NULL)
{
return NULL;
}
char *pbak = _String; // 备份首地址
while (*pbak != '\0')
{
int flag = ; // 假定相等
char *pfind = pbak; // 从当前字符循环母串
char *psub = _Substring; // 从当前字符循环子串
while (*psub != '\0')
{
if (*pfind != '\0') // 母串提前结束
{
if (*pfind != *psub) // 判断字符串不等
{
flag = ;
break;
}
else
{
pfind++;
psub++; // 指针往前移动
}
}
else
{
flag = ;
break;
}
}
if (flag)
{
return pbak; // 保存当前地址
} pbak++; // 指针不断向前移动,遍历母串的每一个字符
} return NULL; } void main()
{
char str[] = "hello,NoThx";
char sub[] = "x"; //char *p = strstr(str, sub);
char *p = mystrstr1(str, sub);
//char *p = mystrstr2(str, sub);
if (p != NULL)
{ printf("找到 %p %c", p, *p);
}
else
{
printf("没找到");
} system("pause");
}
 #include <stdio.h>
#include <stdlib.h>
#include <string.h> /* size_t __cdecl strlen(_In_z_ char const* _Str); */ // 下标法
unsigned int mystrlen(const char * str)
{
int length = ;
/* for循环
for (int i = 0;;i++)
{
if (*(str + i) == '\0') //下标法 *(str + i) <==> str[i]
{
break;
}
length++;
} */
/* while循环
int i = 0;
while (1)
{ if (str[i] == '\0')
{
break;
}
else
{
length++;
i++;
}
} */ int i = ;
do
{
if (str[i] == '\0')
{
break;
}
else
{
length++;
i++;
}
} while (); return length;
} unsigned int mystrlenaddr(const char * str)// const说明只能读取,不能改变
{
int length = ;
for (const char *p = str; *p != '\0'; p++)
{
length++;
} return length;
} void main()
{
char *str = "afasfa"; //int lenth = mystrlen(str);
int lenth = mystrlenaddr(str); printf("%d\n", lenth); system("pause");
}
 #include <stdio.h>
#include <stdlib.h>
#include <string.h> /*
_ACRTIMP errno_t __cdecl strcpy_s(
_Out_writes_z_(_SizeInBytes) char* _Destination,
_In_ rsize_t _SizeInBytes,
_In_z_ char const* _Source
);
*/ char *mystrcpy(char *dest, const char *source)
{
if (dest == NULL || source == NULL)
{
return NULL;
}
for (int i = ; ; i++)// 下标法
{
dest[i] = source[i];
if (*(source + i) == '\0')
{
break;
} }
return dest;
} char *mystrcpyaddr(char *dest, const char *source)
{
if (dest == NULL || source == NULL)
{
return NULL;
}
char *phead = dest; while ((*dest++ = *source++))
{ }
return phead;
} void main()
{
char str[] = { };
char *p = "hello,how are you";
//strcpy_s(str, 100, p); // 字符串拷贝 printf("%s\n", mystrcpyaddr(str, p));
int x = , y = -; //printf("x %% y = %d\n", x%y); system("pause");
}

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

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

    C 语言 字符串命令 strstr()的用法 实现将原字符串以分割串分割输出 strstr() 命令是在原字符串中查找指定的字符串第一次出现的地址,用这个特性可以实现字符的分割,判断是否包涵等功能: ...

  2. iOS 生成随机字符串 从指定字符串随机产生n个长度的新字符串

    随机字符串 - 生成指定长度的字符串 -(NSString *)randomStringWithLength:(NSInteger)len { NSString *letters = @"a ...

  3. PHP基础语法: echo,var_dump, 常用函数:随机数:拆分字符串:explode()、rand()、日期时间:time()、字符串转化为时间戳:strtotime()可变参数的函数:PHP里数组长度表示方法:count($attr[指数组]);字符串长度:strlen($a)

    PHP语言原理:先把代码显示在源代码中,再通过浏览器解析在网页上 a. 1.substr;  //用于输出字符串中,需要的某一部分 <?PHP $a="learn php"; ...

  4. 使用PHP的strstr()函数来统计一段字符串中元音字母的个数(区分大小写)

    <?php/**练习:统计一段字符串中所有元音字母的个数(区分大小写)*/$str='This is a test file.'; //原始字符串echo $str.'<br>'; ...

  5. 内存及字符串操作篇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> 定 ...

  6. PHP 语法字符串函数 strcmp、strlen 使用及实现

    说明 这里基于 php7.2.5 进行测试,php7 之后内部结构变化应该不是太大,但与 php5.X 有差别. 函数分类 用户自定义函数 say(); function say() { echo & ...

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

    /*已知字符串采用带结点的链式存储结构(详见linksrting.h文件),请编写函数linkstring substring(linkstring s,int i,int len),在字符串s中从第 ...

  8. 38 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。

    题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. public class _038PrintLength { public static void main(Stri ...

  9. 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度

    import java.util.Scanner; /** * [程序38] * * 题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度. * * @author Jame ...

随机推荐

  1. IT行业所面临的问题

    在阅读了“2015 IT行业大学生就业分析报告”和“2014年十大最热门行业和职业排行榜 IT行业最吃香_联展新闻”两则新闻后,我决定用一篇和老师对话的形式来表达我的感受. dym:人潮汹涌的招聘市场 ...

  2. app测试更多机型系统解决方法

    手头上测试机有限,不可能每个机型每个系统都 有一部手机,此时寻求一个什么都有的测试平台就显得尤为重要了. 作为小白的我刚刚使用了一波腾讯优测,简单粗暴有效给力,而且新注册认证用户还有60min免费使用 ...

  3. B-2阶段组员分数分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块 武 武 武 武 杨 宫 宫 杨 宫 谢 李 杨 李 谢 李 谢 李 谢 杨 宫 扬 谢 宫 李 武 评 ...

  4. 31. Ubuntu15.04系统中如何启用、禁用客人会话

    https://jingyan.baidu.com/article/046a7b3edf9639f9c27fa995.html 31. Ubuntu15.04系统中如何启用.禁用客人会话 听语音 | ...

  5. DNS原理及解析过程

    本文主要参考自:http://369369.blog.51cto.com/319630/812889 并做了小幅修改 什么是DNS? 因特网上的主机和人类一样,也可以使用多种方式进行识别.主机的一种识 ...

  6. linux 上传下载

    xshell yum就是傻瓜式的安装软件,你要装什么,yum什么就行了,红帽系统才有yum,乌班图和debian是没有的 输入命令:sudo yum -y install lrzsz rz  上传 从 ...

  7. uoj54-bzoj3434-时空穿梭

    题意 在一个 \(n\) 维空间中,求一个点可以用一个 \(n\) 维向量 \((x_1,x_2,\dots x_n)\) 表示.现在要选出 \(c\) 个点,有三个限制: 设 \(x_i\) 表示任 ...

  8. BZOJ 1226 学校食堂(状压DP)

    状压DP f(i,j,k)表示前i−1个人已经吃了饭,且在i之后的状态为j的人也吃了饭(用二进制表示后面的状态),最后吃的那个人是i之后的第k个 (注意k可以是负数) 然后 如果j&1=1那么 ...

  9. 【bzoj4321】queue2 dp

    题目描述 n 个沙茶,被编号 1~n.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行:  现在想知道,存在多少方案满足沙茶们如此不苛刻的条件.  ...

  10. 【移动支付】.NET支付宝App支付接入

    一.前言        最近也是为了新产品忙得起飞,博客都更新的慢了.新产品为了方便用户支付,需要支付宝扫码接入.这活落到了我的身上.产品是Windows系统下的桌面软件,通过软件生成二维码支付.界面 ...