#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. QTemporaryDir及QTemporaryFile建立临时目录及文件夹

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTemporaryDir及QTemporaryFile建立临时目录及文件夹     本文地址 ...

  2. 爬虫学习之-Python list 和 str 互转

      一.list转字符串 命令:''.join(list)其中,引号中是字符之间的分割符,如“,”,“;”,“\t”等等如:list = [1, 2, 3, 4, 5]''.join(list) 结果 ...

  3. perf的采样模式和统计模式

    perf的采样模式和统计模式 统计模式和采样模式使用寄存器的方法不相同; 在统计模式下,每次调度之前设置寄存器,调度之后清理寄存器,留个下个进程使用;PMU寄存器的使用方法; 在采样模式下,每次 pm ...

  4. 学习websocket-SignalR,MVC中使用SignalR打造酷炫实用的即时通讯

    http://www.cnblogs.com/Leo_wl/p/4793284.html http://www.fangsi.net/archives/1144.html

  5. 当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用

    当我们有多个类 继承同一个父类 这时候使用多态时候 可以使用该父类的类型做引用 不需要将object做引用

  6. 【bzoj5147】casino 区间dp

    题目描述 赌城拉斯维加斯的米高梅大赌场最近推出了一种新式赌法.它的玩法是由庄家设局(所用赌具是一批五颜六色的筹码),赌徒只要交付一定数额的赌资即可入局.开赌前庄家将手中的筹码依次排开铺成一排构成一局, ...

  7. BZOJ3574 HNOI2014抄卡组(哈希)

    容易发现通配符中间的部分可以任意匹配,会造成的无法匹配的仅仅是前后缀,前缀和后缀可以分别独立处理.如果字符串均有通配符,只需要按前/后缀长度排序然后暴力匹配就可以了. 问题在于存在无通配符的字符串.显 ...

  8. CF605E Intergalaxy Trips 贪心 概率期望

    (当时写这篇题解的时候,,,不知道为什么,,,写的非常冗杂,,,不想改了...) 题意:一张有n个点的图,其中每天第i个点到第j个点的边都有$P_{i, j}$的概率开放,每天可以选择走一步或者留在原 ...

  9. 【CF625E】Frog Fights(模拟)

    [CF625E]Frog Fights(模拟) 题面 CF 洛谷 翻译: 有\(n\)只青蛙在一个被分为了\(m\)等分的圆上,对于每份顺时针依次标号. 初始时每只青蛙所在的位置是\(p_i\),速度 ...

  10. 光荣之路测试开发面试linux考题之四:性能命令

    Hi,大家好我是tom,I am back.今天要给大家讲讲linux系统一些性能相关命令. 1.fdisk 磁盘管理 是一个强大的危险命令,所有涉及磁盘的操作都由该命令完成,包括:新增磁盘.增删改磁 ...