库函数网址查询:https://legacy.cplusplus.com/reference/cstring/memcmp/ 库函数
memset
,memcpy
,memmove
,memcmp
都存在库函数<cstring> (string.h)
中,使用需要使用#include <string.h>
memset()
是C语言中一个常用的标准库函数,它的作用是将一块内存区域的值设置为指定的值。
语法:
void * memset ( void * ptr, int value, size_t num );
str: 要设置的内存区域的起始地址。
value: 要设置的值,通常是一个无符号字符。
num: 要设置的字节数。
memset()
函数会将从 str
开始的 num
个字节的内存区域都设置为值 value
。返回值是指向 str
的指针。
通常使用方法:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "almost very programmer should know memset!";
memset(str, '-', 6);
printf("%s\n", str);
return 0;
}
我们使用memset()
将str
数组前5
个字符都设置为字符‘ - ’
typedef struct
{
int id;
char name[20];
float score;
}Student;
int main()
{
Student s;
memset(&s, 0, sizeof(Student));
printf("Student info:\n");
printf("ID: %s\n", s.id);
printf("Name: %s\n", s.name);
printf("Score: %.2f\n", s.score);
return 0;
}
,我们使用 memset()
将 Student
结构体变量 s
的所有字段都初始化为 0
。这样可以确保结构体中的所有成员都被初始化为默认值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int *arr = (int *)malloc(10 * sizeof(int));
memset(arr, 0, 10 * sizeof(int));
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
return 0;
}
我们动态分配了一个包含 10
个整数的数组,然后使用 memset()
将所有元素初始化为 0
。这样可以确保数组中的所有元素都被初始化为默认值。
注意:memset()
函数通常用于初始化内存,而不是用于复制或移动内存区域。如果需要复制或移动内存区域,应该使用 memcpy()
或 memmove()
函数。
memcpy()
是 C 语言中一个常用的标准库函数,它的作用是将一块内存区域的内容复制到另一块内存区域。
语法:
void *memcpy(void *dest, const void *src, size_t n);
dest: 目标内存区域的起始地址。
src: 源内存区域的起始地址。
n: 要复制的字节数。
memcpy()
函数会将从 src
开始的 n
个字节的内容复制到从 dest
开始的内存区域。返回值是指向 dest
的指针。
举个例子:
struct
{
char name[40];
int age;
}person,person_copy;
int main()
{
char myname[] = "Pierre de Fermat";
memcpy(person.name, myname, strlen(myname) + 1);
person.age = 88;
memcpy(&person_copy, &person, sizeof(person));
printf("person_copy: %s,%d\n", person_copy.name, person_copy.age);
return 0;
}
与 memmove()
函数不同的是,memcpy()
函数不能处理源内存区域和目标内存区域重叠的情况。
如果源内存区域和目标内存区域重叠,并且是同一个字符串,可能会导致数据损坏。
因此,在处理可能重叠的内存区域时,应该使用 memmove()
函数。
#include <stdio.h>
#include <string.h>
int main()
{
char buffer[10] = "abcdefghi";
memcpy(buffer + 2, buffer, 5);
printf("%s\n", buffer);
return 0;
}
memmove()
是 C 语言中另一个常用的标准库函数,它的作用是将一块内存区域的内容复制到另一块内存区域。
memmove()
函数的定义:
void *memmove(void *dest, const void *src, size_t n);
dest: 目标内存区域的起始地址。
src: 源内存区域的起始地址。
n: 要复制的字节数。
memmove()
函数会将从 src
开始的 n
个字节的内容复制到从 dest
开始的内存区域。返回值是指向 dest
的指针。
示例:
int main()
{
char buffer[10] = "abcdefghi";
memmove(buffer + 2, buffer, 5);
printf("%s\n", buffer);
return 0;
}
我们使用 memmove()
将 buffer
数组中从下标 0
开始的 5
个字节复制到从下标 2
开始的位置。这样可以实现将字符串向右移动 2
个位置的效果。
与 memcpy()
函数不同的是,memmove()
函数可以处理源内存区域和目标内存区域重叠的情况。这是因为 memmove()
函数会先将整个源内存区域复制到一个临时缓冲区,然后再从缓冲区复制到目标内存区域。这样可以避免在复制过程中出现数据损坏的问题。
memcmp()
是 C 语言中一个常用的标准库函数,它的作用是比较两块内存区域的内容。
int memcmp(const void *s1, const void *s2, size_t n);
s1: 要比较的第一块内存区域的起始地址。
s2: 要比较的第二块内存区域的起始地址。
n: 要比较的字节数。
memcmp()
函数会比较从 s1
和 s2
开始的 n
个字节的内容
返回以下结果:
0
。s1
中的值小于 s2
中的值,返回一个负值。s1
中的值大于 s2
中的值,返回一个正值。#include <stdio.h>
#include <string.h>
int main()
{
char buffer1[10] = "abcdef";
char buffer2[10] = "abcdeG";
int result = memcmp(buffer1, buffer2, 6);
if (result < 0)
{
printf("buffer1 is less than buffer2\n");
}
else if (result > 0)
{
printf("buffer1 is greater than buffer2\n");
}
else
{
printf("buffer1 is equal to buffer2\n");
}
return 0;
}
memcmp()
和 strncmp()
函数都是用于比较字符串的函数,区别:
memcmp()
比较的是两块内存区域的内容,可以比较任意类型的数据。strncmp()
比较的是两个以null
字符结尾的字符串,只能比较字符串。memcmp()
按字节比较,直到遇到第一个不同的字节或比较完指定的字节数。strncmp()
按字符比较,直到遇到null字符或比较完指定的字符数。memcmp()
返回一个整数,表示比较结果。strncmp()
返回一个整数,表示比较结果。memcmp()
适用于需要比较任意类型数据的情况,如比较结构体、数组等。strncmp()
适用于需要比较字符串的情况。总结:memcmp()
更加底层和通用,可以用于比较任意类型的内存区域,而 strncmp()
则更适用于字符串比较的场景。在需要比较字符串时,使用 strncmp()
通常更加直观和方便。
例如比较结构体
typedef struct
{
int id;
char name[20];
float score;
} Student;
int main()
{
Student s1 = { 1, "Asen", 90.5 };
Student s2 = { 1, "Asen", 90.5 };
Student s3 = { 2, "Bob", 85.0 };
// 比较 s1 和 s2
if (memcmp(&s1, &s2, sizeof(Student)) == 0)
{
printf("s1 and s2 are the same\n");
}
else
{
printf("s1 and s2 are different\n");
}
// 比较 s1 和 s3
if (memcmp(&s1, &s3, sizeof(Student)) == 0)
{
printf("s1 and s3 are the same\n");
}
else
{
printf("s1 and s3 are different\n");
}
return 0;
}
输出:
s1 and s2 are the same
s1 and s3 are different