#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
以上就是关于字符串函数的实现,当然还有一些没有实现,后期会慢慢补充,如果那里有错误,还望读者不吝赐教。