本篇内容介绍了“C语言字符串操作函数的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*******string库函数集合********/
int my_strlen(const char *str)
{
int ret = 0;
assert(str != NULL);
while(*str++ != '\0')
++ret;
return ret;
}
/*******不得自定义变量*********/
int my_strlen2(const char *str)
{
if((*str) == '\0')
return 0;
else
return (1 + my_strlen(++str));
}
//=========字符串查找=========//
char *my_strstr(char *strSrc, char *substr)
{
int i, j;
int lenstr, sublen;
int num;
if(strSrc == NULL || substr == NULL)
return NULL;
lenstr = strlen(strSrc);
sublen = strlen(substr);
if(lenstr < sublen)
return NULL;
num = lenstr - sublen;
for(i = 0; i <= num; i++)
{
for(j = 0; j < sublen; j++)
{
if(strSrc[i+j] != substr[j])
break;
}
if(j == sublen)
return (strSrc + i);
}
return NULL;
}
char *my_strstr2(const char *strSrc, const char *str)
{
assert(strSrc != NULL && str != NULL);
const char *s = strSrc;
const char *t = str;
for(; *strSrc != '\0'; ++strSrc)
{
for( s= strSrc, t = str; (*t != '\0') && (*s == *t); ++s, ++t )
{
}
if(*t == '\0')
return (char *)strSrc;
}
return NULL;
}
//=========字符串拷贝=========//
char *my_strcpy(char *strDst, char *strSrc)
{
if(strDst == strSrc)
return strDst;
assert( (strDst != NULL) && (strSrc != NULL) );
char *address = strDst;
while( (*strDst++ = *strSrc++) != '\0');
return address;
}
char *my_strncpy(char *strDst, char *strSrc, int count)
{
assert(strDst != NULL && strSrc != NULL);
char *address = strDst;
while((count--) && (*strSrc != '\0'))
*strDst ++ = *strSrc++;
*strDst = '\0';
return address;
}
//==========字符串链接=========//
char *my_strcat(char *strDst, const char *strSrc)
{
assert((strDst != NULL) && (strSrc != NULL));
char *address = strDst;
while(*strDst != '\0')
++ strDst;
while((*strDst++ = *strSrc++) != '\0');
return address;
}
char *my_strncat(char *strDst, const char *strSrc, unsigned int count)
{
assert((strDst != NULL) && (strSrc != NULL));
char *address = strDst;
while(*strDst != '\0')
++strDst;
while(count-- && *strSrc != '\0')
*strDst++ = *strSrc++;
*strDst = '\0';
return address;
}
//=========将字符串所有替换成字符=========//
char *my_strset(char *str, int c)
{
assert(str != NULL);
char *s = str;
for(; *s != '\0'; ++s)
*s = (char)c;
return str;
}
char *my_strnset(char *str, int c, unsigned int count)
{
assert(str != NULL);
char *s = str;
for(; (*s != '\0') && ((s - str)<count); ++s)
*s = (char) c;
return str;
}
//=====================================================
// 题目:比较2个字符串,用O(n)时间和恒量空间
//=====================================================
int my_strcmp(const char *str1, const char *str2)
{
while((*str1 != '\0') && (*str2 != '\0') && (*str1 = *str2))
{
str1++;
str2++;
}
return (*str1 - *str2);
}
int my_strncmp(const char *str1, const char *str2, unsigned int count)
{
assert((str1 != NULL) && (str2 != NULL));
while(*str1 && *str2 && (*str1 == *str2) && count--)
{
++ str1;
-- str2;
}
return (*str1 - *str2);
}
//===========查找字符出现的位置============//
char *my_strrchr(const char *str, int c)
{
assert(str != NULL);
const char *s = str;
while(*s != '\0')
++ s;
for(--s; *s != (char)c; --s)
{
if(s == str)
return NULL;
}
return (char *)s;
}
//===========字符串的逆序============//
char my_strrev(char *str)
{
assert(str != NULL);
char *s = str, *t = str, c;
while(*t != '\0')
++t;
for(--t; s < t; ++s, --t)
{
c = *s;
*s = *t;
*t = c;
}
return str;
}
//=========字符串的切割==========//
char *my_strtok(char *strToken, const char *str)
{
assert(str != NULL);
static char *last;
if(strToken == NULL && (strToken = last)==NULL)
return (NULL);
char *s = strToken;
const char * t = str;
while(*s != '\0')
{
t = str;
while(*t != '\0')
{
if(*s == *t)
{
last = s + 1;
if(s - strToken == 0)
{
strToken = last;
break;
}
*(strToken + (s - strToken))= '\0';
return strToken;
}
++t;
}
++s;
}
return NULL;
}
//=========内存拷贝========//
void my_memcpy(void *dst, const void *src, unsigned int num)
{
assert((dst!=NULL) && (src != NULL));
void *address = dst;
while(num--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return address;
}
//===========内存清零=========//
void *my_memset(void *str, int c, unsigned int count)
{
assert(str != NULL);
void *s = str;
while(count --)
{
*(char *)s = (char)c;
s = (char *)s + 1;
}
return str;
}
//=====================================================
// 题目:在给定的字符串中查找【由给定字符ch构成的】长度最长的串
// 分析:例如在abccdefaaag中长度最长的是aaa
// 返回值:查找串的首地址
//=====================================================
char *search_str_maxlen(char *strSrc, char ch)
{
char *strTemp = NULL, *strDst = NULL;
int iTemp, iCount = 0;
while(*strSrc != '\0')
{
if((*strSrc) == ch)
{
iTemp = 0;
strTemp = strSrc;
while((*strSrc) == ch)
{
strSrc++;
iTemp++;
}
if(iTemp > iCount)
{
iCount = iTemp;
strDst = strTemp;
}
if((*strSrc)=='\0')
break;
}
strSrc++;
}
return strDst;
}
//========================================================
// 题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。
// 分析:这道题是2006 年google 的一道笔试题。
// 思路:将所有出现的字符的个数存储在数组a中
//========================================================
char first_single_char(char *str)
{
int a[255];
char *p = str;
memset(a, 0, 255*sizeof(int));
while(*p != '\0')
{
a[*p] ++;
p++;
}
p = str;
while((*p) != '\0')
{
if(a[*p] == 1)
return *p;
}
return '\0';
}
花了一个下午,终于搞定。
“C语言字符串操作函数的实现方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.xuebuyuan.com/3266459.html