【c++随笔28】strcmp 和 memcmp对比
- [1. 功能对比](#1. 功能对比)
- [2. 函数原型](#2. 函数原型)
- [3. 参数、返回值](#3. 参数、返回值)
- [4. 操作行为](#4. 操作行为)
- [5. 使用场景](#5. 使用场景)
- [6. 错误处理](#6. 错误处理)
- [8. 性能与优化](#8. 性能与优化)
- [9. 示例](#9. 示例)
- 总结
原创作者:郑同学的笔记
原文链接:https://zhengjunxue.blog.csdn.net/article/details/144635301
strcmp 和 memcmp 是 C 标准库中的两个函数,它们的功能类似,都是进行比较操作,但它们的应用场景和行为有所不同。以下是这两个函数的对比:
1. 功能对比
-
strcmp:
用于比较两个字符串的字面值。它逐字符地比较两个字符串,直到找到不同的字符或者遇到字符串的结束符 \0 为止。
-
memcmp:
用于比较两个内存区域的内容。它逐字节比较两个内存区域的内容,比较的是内存中的每个字节,而不关心是否是字符串(即是否以 \0 结尾)。
2. 函数原型
- strcmp:
cpp
int strcmp(const char *str1, const char *str2);
比较两个字符串的字面值(从头到尾,直到遇到结束符 \0)。
- memcmp:
cpp
int memcmp(const void *ptr1, const void *ptr2, size_t num);
比较两个内存区域(每个字节),比较的长度由 num 参数指定。
3. 参数、返回值
参数说明
-
strcmp:
str1:指向第一个字符串的指针。
str2:指向第二个字符串的指针。
-
memcmp:
ptr1:指向第一个内存区域的指针。
ptr2:指向第二个内存区域的指针。
num:要比较的字节数。
返回值
-
strcmp:
如果两个字符串相等,返回 0;
如果 str1 小于 str2,返回负值;
如果 str1 大于 str2,返回正值。
-
memcmp:
如果 ptr1 和 ptr2 相等,返回 0;
如果 ptr1 小于 ptr2,返回负值;
如果 ptr1 大于 ptr2,返回正值。
4. 操作行为
-
strcmp:
字符串比较:它按字符逐个比较 str1 和 str2 的内容,直到找到第一个不同的字符或者遇到字符串结束符 \0。
只适用于字符串:strcmp 专门用于比较字符串,因此它假定输入的 str1 和 str2 都是以 \0 结尾的字符数组(C 字符串)。
-
memcmp:
内存比较:它按字节逐个比较两个内存区域的内容,比较的是原始内存数据。
不关心数据类型:memcmp 比较的是内存块的原始字节,不管这些字节是否是有效的字符串,也不管这些字节所代表的数据类型是什么。
5. 使用场景
-
strcmp:
用于比较字符串的内容。它适用于判断两个字符串是否相等、哪个字符串字典序较大或较小。
比如,检查两个字符串是否相同,或者在排序时进行字符串的比较。
-
memcmp:
用于比较任意类型的内存块。它适用于比较结构体、数组、缓冲区等原始内存数据,不仅仅限于字符串。
比如,比较两个二进制数据块是否相等,或者比较数组、结构体等数据结构的内容。
6. 错误处理
- strcmp:
如果输入的两个字符串没有以 \0 结尾,strcmp 的行为是未定义的,因为它会继续读取超出字符串范围的内存。
适用于 C 字符串(以 \0 结尾的字符数组)。 - memcmp:
如果输入的两个内存区域有重叠,memcmp 的行为是未定义的(对于重叠内存区域,应使用 memmove)。
memcmp 不关心数据类型,可以用于任何类型的数据,只要知道要比较的字节数。
8. 性能与优化
- strcmp:
由于它逐个字符比较,性能与字符串的长度成正比。在比较过程中,strcmp 会在遇到第一个不同的字符或者遇到字符串结束符时停止,因此在最好的情况下,它的性能与字符串的长度是线性关系。 - memcmp:
逐字节比较内存区域的内容,性能与比较的字节数成正比。memcmp 可以用于比较任意类型的数据,包括结构体、数组等,且它的性能通常较好,特别是在处理大数据块时。
9. 示例
- strcmp 示例:
cpp
#include <iostream>
#include <cstring>
int main() {
const char* str1 = "Hello";
const char* str2 = "Hello";
const char* str3 = "World";
// 比较相等的字符串
if (strcmp(str1, str2) == 0) {
std::cout << "str1 and str2 are equal." << std::endl;
} else {
std::cout << "str1 and str2 are not equal." << std::endl;
}
// 比较不相等的字符串
if (strcmp(str1, str3) == 0) {
std::cout << "str1 and str3 are equal." << std::endl;
} else {
std::cout << "str1 and str3 are not equal." << std::endl;
}
return 0;
}
- memcmp 示例:
cpp
#include <iostream>
#include <cstring>
int main() {
int arr1[] = {1, 2, 3};
int arr2[] = {1, 2, 3};
int arr3[] = {1, 2, 4};
// 比较两个相同的数组
if (memcmp(arr1, arr2, sizeof(arr1)) == 0) {
std::cout << "arr1 and arr2 are equal." << std::endl;
} else {
std::cout << "arr1 and arr2 are not equal." << std::endl;
}
// 比较两个不同的数组
if (memcmp(arr1, arr3, sizeof(arr1)) == 0) {
std::cout << "arr1 and arr3 are equal." << std::endl;
} else {
std::cout << "arr1 and arr3 are not equal." << std::endl;
}
return 0;
}
总结
| 特性 | strcmp | memcmp |
|---|---|---|
| 比较内容 | 比较字符串(以 \0 结尾的字符数组) | 比较内存区域(按字节) |
| 比较的结束条件 | 遇到 \0 或不同字符时停止 | 比较指定的字节数,完全按照字节进行比较 |
| 返回值 | 如果字符串相等返回 0,否则返回非零值 | 如果内存区域相等返回 0,否则返回非零值 |
| 使用场景 | 比较字符串,判断字符串是否相等、字典序大小 | 比较任何内存区域的数据(如结构体、数组等) |
| 错误处理 | 字符串必须以 \0 结尾,未以 \0 结尾时未定义 | 内存区域不能重叠,若重叠应使用 memmove |
strcmp 专门用于字符串比较,适用于字符数组的比较。
memcmp 适用于比较任意类型的内存数据,不关心数据的具体类型。