【c++随笔28】strcmp 和 memcmp对比

【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 适用于比较任意类型的内存数据,不关心数据的具体类型。

相关推荐
小成2023032026519 分钟前
C++~07补充
开发语言·c++
hold?fish:palm37 分钟前
40 二叉树的直径
c++·leetcode
解决小子1 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
lunar_coder2 小时前
【C++】如何解决智能指针的析构函数,如何实现shared_ptr的引用计数以及解决shared_ptr的循环引用
c++·1024程序员节
白白白小纯3 小时前
C++进阶.多态
c++
2401_885885043 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅4 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
凯瑟琳.奥古斯特4 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展