#define _CRT_SECURE_NO_WARNINGS 1
//求字符串长度。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
//size_t my_strlen( const char *str)
//{
// assert(str != NULL);
// int count = 0;
// while (*str++)
// {
// count++;
// }
// return count;
//}
size_t my_strlen(const char *str)
{
assert(str != NULL);
if (*str++)
return my_strlen(str)+1;//当*str不为\0时,调用该函数,并统计一个字符。
else
return 0;//当*str为零时,递归结束。
}
int main()
{
const char *str = "1234567890";
printf("%d\n", my_strlen(str));
system("Pause");
return 0;
}
////字符串的比较。
#include
int my_strcmp(const char *dest, const char *src)
{
while ((*src != '\0') && (*dest == *src))
{
dest++;
src++;
}
return ((*dest - *src)>0 ? 1 : ((*dest - *src)<0 ? -1 : 0));
}
int main()
{
const char *p1 = "dbcd";
const char *p2 = "dbc";
printf("%d\n", my_strcmp(p1, p2));
system("pause");
return 0;
}
////判断一个字符串是不是另一个字符串的子字符串。
#define _CRT_SECURE_NO_WARNINGS 1
#include
char *my_strstr(const char *dest, const char *src)
{
char *src_temp ;//源字符串的指针临时变量。
char *dest_temp ;//目标字符串的指针临时变量。
while (*dest )//判断是否到目标字符串的最后一位。
{
dest_temp = dest;//每次内循环结束重新赋值,为目标字符串的指针临时变量重新赋址。
src_temp = src;//每次内循环结束重新赋值,使源字符串的指针临时变量重新指向第一个字符。
while ((*dest_temp )&&(*src_temp == *dest_temp++))//逐个判断源字符串字符是否等于目标字符串字符。
{
src_temp++;
}
if (*src_temp == '\0')//判断源字符串字符的指针临时变量是否达到最后一个字符。
return dest;//如果是就返回目标字符串第一次正确匹配时的第一个字符的地址。
dest++;//如果不是让目标字符串指针临时变量向后移动一个字节。
}
return NULL;//如果没有找到返回空指针。
}
int main()
{
const char *p1 = "cdcecdecd";
const char *p2 = "cdcecdecde";
printf("%p\n", my_strstr(p1, p2));
system("pause");
return 0;
}
////字符串的追加
#include
#include
char *my_strcat(char *dest,const char *src)
{
assert(dest != NULL);//判断目标字符串指针临时变量是否为空。
assert(src != NULL);//判断源字符串指针临时变量是否为空。
char *ret = dest;//创建一个返回的指针变量,保存目标字符串的起始地址。
while (*dest != '\0')//使目标字符串指针临时变量指向'\0'。
{
dest++;
}
while (*dest++ = *src++)//把源字符串内容追加给目标字符串。
{
;
}
return ret;//返回目标字符串的起始地址。
}
int main()
{
char arr[50] = "strcat use";
char *p = "dest src";
printf("%s", my_strcat(arr, p));
system("pause");
return 0;
}
//字符串的逆置
#include
char *Inver(char *dest)
{
char *ret = dest;//创建一个返回的指针变量,保存目标字符串的起始地址。
char *tm_val = dest;//源字符串的指针临时变量。
while (*dest)//使源字符串的指针临时变量指向'\0'。
{
dest++;
}
while (tm_val<(--dest))//交换内容
{
*tm_val = *tm_val^*dest;
*dest = *dest^*tm_val;
*tm_val = *tm_val^*dest;
tm_val++;
}
return ret ;//返回目标字符串的起始地址。
}
int main()
{
char arr[30] = "abcdefg";
printf("%s", Inver(arr));
system("pause");
return 0;
}
//memcpy()函数的实现。
#include
#include
void *MY_memcpy(void *dest, const void *src,size_t n)
{
char *dest_temp = (char*)dest;//用一个字符型指针接受一个强制类型转换后的目标的起始地址。
char *src_temp = (char*)src;//用一个字符型指针接受一个强制类型转换后的源的起始地址。
while (n--)//控制拷贝次数
{
*dest_temp++ = *src_temp++;//把源的内容一个字节一个字节的拷贝给目标,然后两个指针变量同时向后移动一个字节
}
return dest;//返回目标的起始地址
}
int main()
{
int arr[30] = { 0 };
int arr1[5] = { 1, 2, 3, 4, 5 };
int i = 0;
MY_memcpy(arr, arr1, sizeof(arr1));
/*MY_memcpy(arr+1, arr, sizeof(arr1));*///地址重叠时就会出现拷贝错误,与下面memmove()函数分别运行,对照结果
/*memmove(arr + 1, arr, sizeof(arr1));*///验证地址重叠时拷贝后的结果
while (i<10)
printf("%d ",arr[i++] );
system("pause");
return 0;
}
//memmove()函数的实现。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
void *MY_memmove(void *dest, const void *src, size_t n)
{
if ((src < dest) && (((char*)src + n - 1) >= (char*)dest) )//当拷贝内容出现这种重叠时,采用倒序赋值。
{
while (n--)
{
*((char*)dest + n) = *((char*)src + n);
}
}
else
{
size_t i = 0;
while (i
以上就是关于字符串函数的实现,当然还有一些没有实现,后期会慢慢补充,如果那里有错误,还望读者不吝赐教。