1.实现strstr
char *strstr( const char *string, const char *strCharSet );
功能:函数用于判断字符串strCharSet是否是strtring的子串。如果是,则该函数返回strCharSet在string中首次出现的地址;否则,返回NULL。
char *MyStrstr(const char *str1, const char *str2)
{
const char *p = str1;//保存str1地址
const char *start = p;//设立标志,起始位置
const char *start1 = str2;
assert(str1 != NULL&&str2 != NULL);
while (*start != '\0')
{
while (*start!='\0'&&*start1!='\0'&&*start==*start1)
{
start++;
start1++;
}
if (*start1 == '\0')//str2走完,说明找到了,返回str1起始位置
{
return p;
}
start1 = str2;//否则str2重新开始
p++;//str1向后走一位作为起始标志
start = p;
}
return NULL;//str1遍历完,依然没有找到,返回空值
}
int main()
{
char *str1 = "abcdefg";
char *str2 = "ccefg";
const char *p = MyStrstr(str1, str2);
printf("%s\n", p);
system("pause");
return 0;
}
2.实现strchr
char *strchr( const char *string, int c );
功能:查找字符串string中首次出现字符c的位置
说明:返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果string中不存在c则返回NULL。
返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL
char *MyStrchr(const char *str1, int c)
{
assert(str1 != NULL);
while (str1 != '\0')
{
if (*str1 == c)
{
return str1;
}
else
{
str1++;
}
}
return NULL;
}
#include<string.h>
#include<assert.h>
int main()
{
char str1[] = "abcd";
char *str = MyStrchr(str1, 'c');
printf("%s\n", str);
system("pause");
return 0;
}
3.strcmp
int strcmp( const char *string1, const char *string2 );
一 . 函数介绍
string1和string2可以使字符串常量或者字符串变量,返回值为整型
函数所用是比较两个字符串的大小
若string1>string2返回正数
若string1<string2返回负数
若string1=string2返回零
字符串的大小的比较是通过ASCII 码来比较
二. 函数实现
字符串相等时,并且指针同时指向’\0’返回零
如果str1先指向’\0’,则str2大
如果str2先指向’\0’,则str1大
字符串不同时,则比较ASCII码的大小
#include<assert.h>
#include<string.h>
int MyStrcmp(const char *str1, const char *str2)
{
assert(str1 != NULL&&str2 != NULL);
//对两个字符串进行断言
while (*str1 == *str2)
//字符相等时,并且都走到'\0'时,表示两字符串相等
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
//2.不相等
if (*str1 > *str2)
{
return 1;
}
if (*str1 < *str2)
{
return -1;
}
}
int main()
{
char *str1 = "abcdef";
char *str2 = "ab";
int n = MyStrcmp(str1, str2);
//若str1大返回正数1,若str2返回-1,若相等返回0
printf("%d\n", n);
system("pause");
return 0;
}
int main()
{
char *str1 = "abcdef";
char *str2 = "ab";
int n = strcmp(str1, str2);
printf("%d\n", n);
system("pause");
return 0;
}
4.memcpy
void *memcpy( void *dest, const void *src, size_t count );
The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions.
memcpy函数将src的计数字节复制到dest。 如果源和目标重叠,则此函数不会确保在覆盖之前复制重叠区域中的原始源字节。 使用memmove处理重叠区域。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void *MyMemcpy(void *str1, void *str2, int count)
{
assert(str1 != NULL&&str2!=NULL);
void *ret = str1;
while (count--)
{
*(char *)str1 = *(char *)str2;
((char *)str1)++;
((char *)str2)++;
}
return ret;
}
int main()
{
int i = 0;
int str1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int str2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
MyMemcpy(str1 + 2, str1, 16);
for (i = 0; i < 9; i++)
{
printf("%d ", str1[i]);
}
printf("\n");
system("pause");
return 0;
}
运行结果:
5.实现memmove
void *memmove( void *dest, const void *src, size_t count );
memmove函数将字节的字节数从src复制到dest。 如果源区域和目标的某些区域重叠,则memmove可确保在覆盖之前复制重叠区域中的原始源字节。
void *MyMemmove(void *str1, void *str2, int count)
{
assert(str1 != NULL&&str2 != NULL);
if (str1 < str2)
{
while (count--)//从前往后赋值
{
*(char *)str1 = *(char *)str2;
((char *)str1)++;
((char *)str2)++;
}
}
else
{
while (count--)//从后往前赋值
{
*((char *)str1 + count) = *((char *)str2 + count);
}
}
}
int main()
{
int i = 0;
int str1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
MyMemmove(str1 + 2, str1, 16);
for (i = 0; i < 9; i++)
{
printf("%d ", str1[i]);
}
printf("\n");
system("pause");
return 0;
}
运行结果: