织梦网站模板源码php,手机百度网站建设,wordpress大型门户,东莞市建设质量监督站长度不受限制的字符串函数#xff1a;strcpy,strcat,strcmp
长度受限制的字符串函数#xff1a;strncpy,strncat,strncmp strlen strlen函数是库函数中我们最常使用的函数#xff0c;它可以求出字符串的长度(不包含‘\0’)
使用方法 通过前面对strlen函数的模拟实现我们知…长度不受限制的字符串函数strcpy,strcat,strcmp
长度受限制的字符串函数strncpy,strncat,strncmp strlen strlen函数是库函数中我们最常使用的函数它可以求出字符串的长度(不包含‘\0’)
使用方法 通过前面对strlen函数的模拟实现我们知道strlen计算长度时是遇到\0才停止的因此如果一个字符串中没有\0,程序就会输出一个随机值如下面代码 因此我们在使用该函数时必须避免这种情况。
注意库函数中的strlen函数的类型是size_t(无符号整形)
模拟实现该函数的功能
这个函数我们实现的次数已经够多了所以不再过多赘述在此提供几种方法
1.指针- 指针 2.计数器 3.递归 strcpy strcpy函数用于将源字符串复制到目标字符串中包括字符串的结束符\0。
使用方法
char* strcpy(char* destination, const char* source);
在使用strcpy函数时也要避免缺少\0的情况此外目标字符串必须具有足够的空间来存储源字符串的内容。 模拟实现该函数的功能
#includestdio.h
#includestring.h
void get_strcpy(char* des,const char* sou)//此处加const的原因是防止原字符串的内容被修改
{assert(sou ! NULL);while (*des *sou){; }
}
int main()
{char arr1[10] xxxxxxx ;char arr2[10] bit;get_strcpy(arr1, arr2);printf(%s\n, arr1);return 0;
} strcat strcat是一个字符串追加函数,它可以把一个字符串追加给另一个字符串后面。
char* strcat(char* destination, const char* source);
使用方法
char *strcpy( char *strDestination, const char *strSource ); 模拟实现该函数的功能
#includestdio.h
char* my_strcat(char* dest, char* sou)
{char* ori dest;//找到源字符串中的\0while (*dest){dest;}//开始追加while (*dest *sou){;}return ori;
}
int main()
{char arr1[30] hello ;char arr2[] world;printf(%s\n,my_strcat(arr1, arr2));return 0;
}
注意事项
字符串不能自己给自己追加通过模拟实现该函数我们发现追加的标志是\0在追加开始时\0就被自己的第一个元素覆盖原先在准备追加最后一位\0的位置已经变成了一个正常的元素所以循环将一直继续不会终止。 strstr 该函数的功能是在一个字符串中查找另一个函数如果查找到则返回起始位置的地址如果找不到则返回一个空指针。
使用方法
char *strstr( const char *string, const char *strCharSet );
第一个参数是源字符串第二个参数是要查找的字符串。 模拟实现该函数的功能
#includestdio.h
#includeassert.h
char* my_strstr(const char* str1, const char* str2)
{assert(str1 str2);const char* s1 NULL;const char* s2 NULL;const char* tmp str1;if (*str2 \0){return (char*)str1;}while (*tmp){s1 tmp;s2 str2;while (*s1 *s2 (*s1 *s2)){s1;s2;}if (*s2 \0){return (char*)tmp;}tmp;}return NULL;
}
int main()
{char arr1[30] aabbccd;char arr2[] bcc;char* pa my_strstr(arr1, arr2);printf(%s\n, pa);return 0;
} memcpy memcpy函数是一个内存操作函数用于在内存中进行数据的复制。它将指定长度的数据从源地址复制到目标地址,不考虑源地址和目标地址是否重叠。当源地址和目标地址有重叠时使用memcpy函数可能导致不可预测的结果。
该函数出现的原因字符串的拷贝可以使用strcpy函数来进行但是通过模拟实现strcpy的功能时我们可以发现strcpy拷贝结束的标志是‘\0’但是如果拷贝的是一个整形数组该函数就不再适用了因此出现了这种更为通用的函数memcpy内存拷贝函数
该函数基本的使用方法void *memcpy( void *dest, const void *src, size_t count ); 使用方法 在msdn上可以查询出该函数的基本使用方式前两个参数都是void类型的指针意味着我们可以传入任意类型的指针参数后面的size_t是无符号的整形单位是字节意味着操作者可以传入自己想要拷贝的字节。 模拟实现该函数的功能 当你对一个指针进行加1操作时实际上会将指针的值增加一个与指针所指向的数据类型大小相等的偏移量。这个偏移量是以字节为单位计算的。
举个例子如果一个指针指向整型数据int那么对该指针进行加1操作后指针将向后移动4个字节因为int类型通常占用4个字节。类似地如果指针指向字符型数据char那么对该指针进行加1操作后指针将向后移动1个字节。
#includestdio.h
#includeassert.h
void* my_memcpy(void* dest, const void* sou, size_t k)//k的单位是字节
{assert(dest sou);void* orignal dest;while (k--){*(char*)dest *(char*)sou;dest (char*)dest 1;sou (char*)sou 1;}return orignal;
}
int main()
{int arr1[10] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };my_memcpy(arr2, arr1, 20);int i 0;for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
} 标准功能的memcpy函数其实不能实现内存重叠的拷贝比如说对于数组int arr[10] {1,2,3,4,5,6,7,8,9,10 };我们如果使用memcpy(arr2,arr,20),结果应该是1,2,1,2,1,2,7,8,9,10.因为存在内存重叠。但是VS上却能够正常编译因为VS把这个函数的功能做的比较彻底算是PLUS版本的memcpy函数超出了本身固有的功能。对于内存重叠的拷贝我们其实还有一个特定的函数memmove下面展开介绍。 memmove memmove 函数是一个内存操作函数用于在内存中移动一段数据。它可以处理源地址和目标地址有重叠的情况保证数据的正确复制。 使用方法 其使用方法与memcpy相似。 模拟实现该函数的功能 通过分析我们发现为保证字符串拷贝不受内存重叠的影响当dest的指针小于sou的指针的时候要从前向后拷贝当dest的指针大于等于sou的指针的时候要从后向前拷贝当dest的指针大于sou宽度时不管是从后向前还是从前到后拷贝都可以。
总结当dest的指针小于sou的指针的时候从前向后拷贝dest的指针大于等于sou的指针的时候从后向前拷贝。
#includestdio.h
#includestring.h
char* my_memmove(void* dest, const void* sou, size_t k)
{char* original dest;if (dest sou){while (k--){*(char*)dest *(char*)sou;dest (char*)dest 1;sou (char*)sou 1;}}else{while (k--){*((char*)dest k) *((char*)sou k);}}
}
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr 2, arr, 20);int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}return 0;
} memcmp memcmp与strcmp的函数设计相似 比较特定的字节后如果值相同返回值为零如果不同返回值是一个负数如果相同返回一个正数。
int memcmp(const void* ptr1, const void* ptr2, size_t num);
ptr1和ptr2分别是要比较的内存区域的起始地址,num是要比较的字节数。 使用方法 #include stdio.h
#include string.hint main()
{char str1[] Hello;char str2[] World;int result memcmp(str1, str2, sizeof(str1));if (result 0){printf(字符串相等\n);} else if (result 0) {printf(str1小于str2\n);} else {printf(str1大于str2\n);}return 0;
} memset memset是库函数中的一个函数用于将一段内存块的值设置为指定的值
void *memset(void *ptr, int value, size_t num); 使用方法 需要注意的是memset函数只能设置每个字节的值因此在设置非字符类型的数组时需要小心。另外memset函数只能设置为整数值不能设置为其他类型的值。