#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. java读取xls和xlsx数据作为数据驱动来用

    java读取Excle代码 拿来可以直接使用 :针对xls 和 xlsx package dataProvider; import java.io.File; import java.io.FileI ...

  2. Spring Boot 学习资料【m了以后看】(转)

    推荐博客: 程序员DD SpringBoot集成 liaokailin的专栏 纯洁的微笑 SpringBoot揭秘与实战 catoop的专栏 方志朋Spring Boot 专栏 简书Spring Bo ...

  3. JVM 内部原理系列

    JVM 内部原理(一)— 概述 JVM 内部原理(二)— 基本概念之字节码 JVM 内部原理(三)— 基本概念之类文件格式 JVM 内部原理(四)— 基本概念之 JVM 结构 JVM 内部原理(五)— ...

  4. java面试及答案

    优秀总结博客 mybatis总结 java并发包相关 一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. hashmap3.反射中,Class. ...

  5. java 类型转型

  6. HDU5669-Road

    题意 给一个\(n\)个点的图,标号为\(1\)到\(n\),进行\(m\)次连边\((a,b,c,d,w)\): for i in range[a,b]: for j in range[c,d]: ...

  7. hdu3507 Print Article(斜率优化入门)(pascal)

    Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...

  8. 题解 P1469 【找筷子】

    这题真是水 咳咳.. 基本思路:桶排 但是可以剪枝. 剪枝方法: 好几种,可以用set(集合),可以用stack(栈), 也可以像我一样的蒟蒻最大最小值...... 但是作者的毒瘤数据应该不会放过我们 ...

  9. Django之CSS,JS静态文件的配置

    一. 专门创建一个目录放静态文件,即CSS,JS等. 1)先把jquery.min拿过来. 2)新建一个CSS文件放入样式 3)在login.html中引入.css文件 在login.html中引入. ...

  10. Linux(一)——认识Linux

    一.Linux介绍 (安装的是Centos6.7) 1.Linux 系统是一套免费使用和自由传播的类 Unix 操作系统(主要用在服务器上),是一个基于 POSIX 和 UNIX 的多用户.多任务.支 ...