#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. spring-test与junit

    1.添加依赖 spring-test junit spring-context(自动添加依赖其他所需的spring依赖包) 2.在class前添加以下注解,用于配置xml文件的位置 @RunWith( ...

  2. 基于图形学混色问题OpenGl的收获

    void myDisplay(void) {glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_B ...

  3. 复利计算1.0,2.0,3.0(java)

    程序源代码: import java.util.Scanner; public class ch { public static void main(String[] args) { Scanner ...

  4. QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QMetaEnum利用Qt元数据实现枚举(enum)类型值及字符串转换     本文地址:ht ...

  5. PHP关于传众多参数还是传上下文对象的性能测试

    在开发微信公众平台平台的过程中,有这么几个参数总是需要传来传去,$userOpenId,$message,$time. 在整个程序的运行过程中,为了函数方便的处理,将这三个变量一直放在参数列表里.关于 ...

  6. [BinaryTree] 二叉树常考知识点

    1.二叉树第i层至多有2^(i-1)个结点(i>=1). 2.深度为k的二叉树上,至多含2^k-1个结点(k>=1) 3.n0 = n2 + 1(度) 4.满二叉树:深度为k且含有2^k- ...

  7. 【.Net】从字符串数组中寻找数字的元素

    那是写一个类别来处理数字元素并收集起来. 开发程序,解决方法不是唯一的.相同的功能实现,方法不止一个. 参考下面代码: class Ak { private string[] _stringArray ...

  8. json 当集合类型的字符串变成集合时候 里面有map类型的转换操作

  9. UVA10859 Placing Lampposts

    我是题面 这道题使我知道了一种很神奇的方法,一定要认真看哦 如果没有被两盏灯同时照亮的边数应尽量大这个限制的话,这就是一道很经典的树形DP题--没有上司的舞会 很可惜,这个限制就在那里,它使得我辛苦写 ...

  10. 获取和验证Windows AD域的用户信息

    1.获取windows AD域用户信息,首先需要有一个ad域管理员权限的账号,用这个账号连接ad域,获取所有域用户信息 用LdapContext,它继承自DirContext public Objec ...