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

相关推荐
随意起个昵称1 小时前
【背包dp】输出方案路径
c++·动态规划
言乐61 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
weixin_307779132 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
kakakahahahaha2 小时前
Windows C盘临时文件清理:%temp%、Windows Temp、Prefetch、Windows.old与hiberfil.sys处理指南
c语言·开发语言·windows
朝朝辞暮i2 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
by209992 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
沙漠之主2 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
朝朝辞暮i2 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
笨笨饿2 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网