模拟库中的字符串处理函数
来源:互联网 发布:淘宝客如意投怎么设置 编辑:程序博客网 时间:2024/06/05 15:03
1.模拟实现strcpy函数的功能
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcpy(char *dst,char const *src){ char *ret = dst; assert(dst); assert(src); while (*dst++ = *src++); return ret;}int main(){ char *msg = "hello world"; char str[20] = {0}; printf("%s \n",my_strcpy(str,msg)); system("pause"); return 0;}
2.实现strncpy函数
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strncpy(char *dst,char const *src,int n){ char *ret = dst; assert(dst); assert(src); //如果拷贝的字符串长度小于源字符串的长度,则将会输出一个不合法的字符串,可能会输出乱码 while (n-- && *src != '\0' ) { *dst++ = *src++; } //如果拷贝的长度小于源字符串的长度 if (n != 0) { while (n--) { *dst = '\0';//应该将dst剩余的空间内容置为'\0' } } return ret;}int main(){ char *msg = "hello world"; char str[20] ; int num = 0; printf("Please Enter your number of copy:>"); scanf("%d",&num); printf("%s \n",my_strncpy(str,msg,num)); system("pause"); return 0;}
当拷贝的字符串长度小于源字符串的长度时,输出结果如下:
3.实现strcat函数的功能:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>char *my_strcat(char *dst,char const *src){ char *dst_end = dst + strlen(dst) ; char *ret = dst_end; assert(dst); assert(src); while (*dst_end++ = *src++); return dst;}int main(){ char dst[40] = "I love "; char *src = " my nation"; printf("%s\n",my_strcat(dst,src)); system("pause"); return 0;}
4.实现strncat函数的功能
#pragma warning(disable : 4996)#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>char *my_strncat(char *dst,const char *src,int n){ assert(dst); assert(src); char *dst_end = dst + strlen(dst); while ((*src != '\0') && (n--)) { *dst_end++ = *src++; } *dst_end = '\0'; return dst;}int main(){ char *src = "world"; char dst[32] = "hello"; my_strncat(dst,src,29); printf("%s \n",dst); system("pause"); return 0;}
5.实现strcmp函数
第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(char const *str1,char const *str2){ assert(str1); assert(str2); while (*str1 != '\0' && *str2 != '\0')//判断字符串中对应字符的大小 { if(*str1 > *str2) { return 1;//str1大于str2中的字符,返回1 } else if(*str1 < *str2) { return -1;//str1小于str2中的字符,返回-1 } else { str1++,str2++;//对应的字符相等,则比较下一个字符 } } if (*str1 == '\0' && *str2 != '\0') { return -1; } else if(*str1 != '\0' && *str2 == '\0') { return 1; } else return 0;}int main(){ char *str1 = "hello world"; char *str2 = "hello world"; printf("%d\n",my_strcmp(str1,str2)); system("pause"); return 0;}
第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(const char *str1,const char *str2){ assert(str1); assert(str2); while (*str1 == *str2) { if (*str1 == '\0') { return 0; } } return *str1 - *str2;}int main(){ const char *str1 = "bcdefg"; const char *str2 = "abcdefg"; int ret = my_strcmp(str1,str2); if (ret > 0) { printf("str1 > str2\n"); } else if(ret < 0) { printf("str1 < str2\n"); } else { printf("str1 = str2\n"); } system("pause"); return 0;}
6.实现strncmp函数
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strncmp(const char *str1,const char *str2,int n){ assert(str1); assert(str2); while (n-- && (*str1 == *str2)) { if (*str1 == '\0') { return 0; } str1++,str2++; } return *str1 - *str2;}int main(){ char *str1 = "abs"; char *str2 = "absb"; int ret = my_strncmp(str1,str2,5); printf("%d \n",ret); system("pause"); return 0;}
7.实现memcpy函数的实现
(标准规定:两块空间之间没有关联,简单的说,就是两块空间没有重叠)
第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void *my_memcpy(void *dst,void const *src,int count){ void *ret = dst; assert(dst); assert(src); while (count--) { *(char*)dst = *(char*)(src); dst = (char *)dst + 1; src = (char *)src + 1; } return ret;}int main(){ char dest[40] = "this is a game"; char *src = "hello"; char *ret = (char *)my_memcpy(dest,src,sizeof(char) * strlen (src)); printf("%s\n",ret); system("pause"); return 0;}
第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void show(int *arr,int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d ",arr[i]); } printf("\n");}void *my_memcpy(void *dst,void *src,int sz){ char *pdst = (char *)dst; char *psrc = (char *)src; assert(dst); assert(src); assert(sz > 0); while (sz--) { *pdst++ = *psrc++; } return dst;}int main(){ int arr1[] = {1,2,3,4,5,6,7,8,9,0}; int arr2[10]; int sz = sizeof(arr1); my_memcpy(arr2,arr1,sz); show(arr2,sz/sizeof(int)); system("pause"); return 0;}
结果如下:
8.实现memmove函数的功能:
(这个函数与memcpy函数最大的不同是它考虑了拷贝的两块空间重叠的情况)
分析图示:
第一种方法:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void *my_memmove(void *dst,void *src,int count){ char *_dst = (char *)dst; char *ret = _dst; char *_src = (char *)src; char *_dst_end = _dst + count - 1; char *_src_end = _src + count - 1; assert(dst); assert(src); while (count--) { if (_src < _dst && _dst < _src_end + 1)//切记:_dst < _src_end + 1(需要减至'\0'的后面) { *_dst_end-- = *_src_end--; } else { *_dst++ = *_src++; } } return ret;}int main(){ char dst[34] = "hello"; int count = strlen(dst) + 1; my_memmove(dst+1,dst,count); printf("%s \n",dst); system("pause"); return 0;}
第二种方法:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>void show(int *arr,int sz){ int i = 0; for (i = 0; i < sz; i++) { printf("%d ",arr[i]); } printf("\n");}void *my_memmove(void *dst,void *src,int count){ char *pdst = (char *)dst; char *psrc = (char *)src; assert(dst); assert(src); assert(count > 0); if (pdst > psrc && pdst < psrc + count) { while (count--) { *(pdst + count) = *(psrc + count);//注意:count一直在减1 } } else { while (count--) { *pdst++ = *psrc++; } } return dst;}int main(){ int arr1[10] = {1,2,3,4,5,6,7,8,9}; int sz = sizeof(arr1); my_memmove(arr1+1,arr1,sz); show(arr1,sz/sizeof(int)); system("pause"); return 0;}
9.模拟实现memset函数:
调用memset函数后的结果:
模拟实现:
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>void show(int *arr,int sz){ int i = 0; assert(arr); for (i = 0; i < sz; i++) { printf("%x ",arr[i]); } printf("\n");}void *my_memset(void *dst,int c,int count){ assert(dst); assert(count > 0); while (count--) { *(char *)dst = 1; dst = (char *)dst + 1; }}int main(){ int arr[10]; show(arr,sizeof(arr)/sizeof(int)); my_memset(arr,1,sizeof(arr)); show(arr,sizeof(arr)/sizeof(int)); system("pause"); return 0;}
0 0
- 模拟库中的字符串处理函数
- 字符串处理库中的字符串函数
- javascript中的字符串处理函数
- VC中的字符串处理函数
- python中的字符串处理函数
- Python 中的字符串处理函数
- 模拟实现C语言中的字符串函数
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数stuff处理Ntext字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- 模拟字符串处理函数 stuff 处理 Ntext 字段
- String常用方法
- matlab之repmat
- 单选框(RadioButton)和复选框(CheckBox)
- nrf51822蓝牙学习笔记之GAP(通用属性配置文件)解读(二)
- Java 数据库 第四章 使用DML语句更改数据
- 模拟库中的字符串处理函数
- Java拼接字符串时,去掉最后一个多余的逗号 .
- Technocup 2017 - Elimination Round 1 (Rated for Div. 2) D. T-shirts Distribution 贪心、flows
- 【opencv小应用】Opencv FaceRecognizer类的简单使用(MFC)
- 一、Web应用和web.xml文件
- Android Studio上使用可视化调试工具Hierarchy Viewer
- tesnsorflow 使用LSTM进行分类的例程
- php 执行linux命令,shell脚本函数,获取服务器运行状态值
- SQL、CodeSmith、C#数据类型对照