1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【C语言】memcmp memcpy memmove memset memchr函数详解

【C语言】memcmp memcpy memmove memset memchr函数详解

时间:2023-04-30 16:37:19

相关推荐

【C语言】memcmp memcpy memmove memset memchr函数详解

目录

一、综述

二、介绍

1、memcmp

2、memcpy

3、memmove

4、memset

5、memchr

一、综述

memcmp、memcpy、memmove、memset、memchr都是C语言中的库函数,在头文件string.h中。

memcmp用于比较内存中缓冲区的大小。

memcpy和memmove的作用是拷贝一定长度的内存的内容。

memset用于缓冲区的填充工作。

memchr用于字符的查找工作。

二、介绍

1、memcmp

描述:

C 库函数int memcmp(const void *str1, const void *str2, size_t n))把存储区str1和存储区str2的前n个字节进行比较。

函数申明:int memcmp(const void *str1, const void *str2, size_t n);参数:str1:指向内存块的指针。str2:指向内存块的指针。n:要被比较的字节数。返回值:如果返回值 > 0,则表示 str1 大于 str2。(VS编译器下返回值为 1)如果返回值 = 0,则表示 str1 等于 str2。(VS编译器下返回值为 0)如果返回值 < 0,则表示 str1 小于 str2。(VS编译器下返回值为 -1)注意:如果两个字符串相同且n的值大于字符串长度的话,不会在\0出现停下程序,会继续往后进行比较,直到达到n次数

例如:

#include <stdio.h>#include <string.h>int main(){char *a = "aBcDeF";char *b = "AbCdEf";char *c = "aacdef";char *d = "aBcDeF";printf("memcmp(a, b):%d\n", memcmp((void*)a, (void*)b, 6));printf("memcmp(a, c):%d\n", memcmp((void*)a, (void*)c, 6));printf("memcmp(a, d):%d\n", memcmp((void*)a, (void*)d, 6));}运行结果:memcmp(a, b):1 memcmp(a, c):-1 memcmp(a, d):0 详解: memcmp((void*)a, (void*)c, 6)比较前6个字节,一个字节一个字节的比较ASCII码:一个英文字母(不分大小写)占用一个字节的空间,一个汉字占用两个字节的空间故:char *a = "aBcDeF"; 这里是6个字节char *c = "aacdef"; 这里是6个字节比较第二个字节时,根据ASCII码值,B<a,则输出-1

2、memcpy

描述:

C 库函数void *memcpy(void *str1, const void *str2, size_t n)从存储区str2复制n个字节到存储区str1

函数申明:void *memcpy(void *destin, void *source, unsigned n);参数:destin:指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。source:指向要复制的数据源,类型强制转换为 void* 指针。n:要被复制的字节数。返回值:该函数返回一个指向目标存储区destin的指针。

例如:

#include <stdio.h>#include <string.h>int main(){int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2,arr1,20);int i = 0;for ( i = 0; i < 10; i++){printf("%d ", arr2[i]);}}运行结果:1 2 3 4 5 0 0 0 0 0 详解:将arr1里的20个字节拷贝到arr2中,int类型数组一个元素大小占4个字节,则需拷贝五个元素

3、memmove

描述:

C 库函数void *memmove(void *str1, const void *str2, size_t n)str2复制n个字符到str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。

函数申明:void *memmove(void *str1, const void *str2, size_t n)参数:str1:指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。str2:指向要复制的数据源,类型强制转换为 void* 指针。n:要被复制的字节数。返回值:该函数返回一个指向目标存储区 str1 的指针。

例如:

1、拷贝其他函数:

#include <stdio.h>#include <string.h>int main (){const char dest[] = "oldstring";const char src[] = "newstring";printf("Before memmove dest = %s, src = %s\n", dest, src);memmove(dest, src, 9);printf("After memmove dest = %s, src = %s\n", dest, src);return(0);}运行结果:Before memmove dest = oldstring, src = newstringAfter memmove dest = newstring, src = newstring详解:memmove(dest, src, 9);src里的9个字节复制给dest

2、拷贝本身:

#include <stdio.h>#include <string.h>void print(int* arr,int sz){for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}}int main(){int arr[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr + 1, arr + 3, 20);int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);printf("\n");return 0;}运行结果:1 4 5 6 7 8 7 8 9 10

4、memset

描述:

C 库函数 void *memset(void *str, int c, size_t n) 复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。

函数声明:void *memset(void *str, int c, size_t n)参数:str:指向要填充的内存块。c:要被设置的值。该值以 int 形式传递,但是函数在填充内存块时是使用该值的无符号字符形式。n:要被设置为该值的字符数。返回值:该值返回一个指向存储区 str 的指针。

例如:

#include <stdio.h>#include <string.h>int main (){char str[50];strcpy(str,"This is string.h library function");puts(str);memset(str,'$',7);puts(str);return(0);}运行结果:This is string.h library function$$$$$$$ string.h library function

5、memchr

描述:

C 库函数void *memchr(const void *str, int c, size_t n)在参数str所指向的字符串的前n个字节中搜索第一次出现字符c(一个无符号字符)的位置。

函数声明:void *memchr(const void *str, int c, size_t n)参数:str:指向要执行搜索的内存块。c:以int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。n:要被分析的字节数。返回值:该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。

例如:

#include <stdio.h>#include <string.h>int main (){const char str[] = "";const char ch = '.';char *ret;ret = (char*)memchr(str, ch, strlen(str));printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);return(0);}运行结果:|.| 之后的字符串是 - |.|

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。