一些字符函数的实现。

来源:互联网 发布:c#课本编程题及答案 编辑:程序博客网 时间:2024/05/17 06:20

#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时,调用该函数,并统计一个字符。elsereturn 0;//当*str为零时,递归结束。}int main(){const char *str = "1234567890";printf("%d\n", my_strlen(str)); system("Pause");return 0;}////字符串的比较。#includeint 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#includechar *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#includechar *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;}//字符串的逆置#includechar *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#includevoid *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#includevoid *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

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

1 0
原创粉丝点击