模拟实现strcmp strncmp函数

本文模拟实现了C语言中的strcmp和strncmp函数,详细解释了如何通过逐字符比较来判断两个字符串是否相等及其相对大小,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

strcmp函数是字符串比较函数,若* str1的第一个字符的ASCII值大于* str2第一个字符的ASCII值,返回值大于0, 若* str1的第一个字符的ASCII值小于*str2第一个字符的ASCII值,返回值小于0, 否则继续比较下一个字符,以此类推,直到遇到’\0’为止

//模拟实现strcmp函数
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strcmp(const char *str1, const char *str2)
{
    assert(str1);
    assert(str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
            return 0;
        str1++;
        str2++;
    }
    if (*str1 > *str2)
        return 1;
    else if (*str1 < *str2)
        return -1;
}
int main()
{
    char *str1 = "ab";
    char *str2 = "abc";
    int ret=my_strcmp(str1, str2);
    printf("%d\n",ret);
    system("pause");
    return 0;
}

strncmp函数是比较2个字符串前n个字符的大小,返回值与strcmp一样


//模拟实现strncmp函数
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strncmp(const char *str1, const char *str2, int count)
{
    assert(str1);
    assert(str2);
    if (*str1 > *str2)
        return 1;
    else if (*str1 < *str2)
        return -1;
    while ((count--) && (*str1 == *str2))
    {
        str1++;
        str2++;
        if ((*str1 == '\0') && (*str2 != '\0'))
        {
            return -1;
        }
        else if ((*str1 != '\0') && (*str2 == '\0'))
        {
            return 1;
        }
        else if ((*str1 == '\0') && (*str2 == '\0'))
        {
            return 0;
        }
    }
    if (count == 0)
        return 0;
}
int main()
{
    char *str1 = "abc";
    char *str2 = "abcdef";
    int ret = my_strncmp(str1, str2, 2);
    printf("%d\n",ret);
    system("pause");
    return 0;
}
### C语言中 `strcmp` 函数的安全使用方法 在 C 语言中,`strcmp` 函数用于比较两个字符串的内容。其函数原型为: ```c int strcmp(const char *str1, const char *str2); ``` 此函数通过逐个字符比较两个字符串的 ASCII 值,直到遇到不同的字符或字符串结束符 `\0` 为止。若两个字符串相等,函数返回 0;若第一个字符串大于第二个字符串,返回正值;若第一个字符串小于第二个字符串,返回负值 [^4]。 #### 安全使用 `strcmp` 的最佳实践 1. **确保字符串以 `\0` 正确终止** `strcmp` 函数依赖于字符串的终止符 `\0`。如果传入的字符串未正确终止,可能导致函数访问超出字符串范围的内存,从而引发未定义行为。因此,应确保所有字符串以 `\0` 结尾 [^2]。 2. **避免空指针传入** 若 `str1` 或 `str2` 为 `NULL`,`strcmp` 会尝试解引用空指针,从而导致运行时错误。应在调用 `strcmp` 前进行指针有效性检查: ```c if (str1 && str2) { int result = strcmp(str1, str2); // 处理比较结果 } else { // 处理空指针情况 } ``` 3. **使用 `strncmp` 限制比较长度** 如果字符串可能包含非终止的缓冲区或长度受控的数据,建议使用 `strncmp` 函数,并指定最大比较长度: ```c int strncmp(const char *str1, const char *str2, size_t n); ``` 这样可以避免因字符串未终止而导致的无限循环或越界访问问题 [^4]。 4. **避免直接使用用户输入进行比较** 若字符串来源于用户输入或外部数据源,应先进行验证和清理,确保其格式和内容符合预期。例如,去除前导或尾随空格、限制长度等。 5. **模拟实现以增强可控性** 在某些对安全性要求极高的场景下,可考虑自行实现字符串比较函数,以控制行为并加入额外的安全检查机制: ```c int my_strcmp(const char *str1, const char *str2) { assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '\0') { return 0; } str1++; str2++; } return (*str1 - *str2); } ``` 上述实现中加入了断言检查,确保输入指针不为 `NULL`,从而避免空指针解引用问题 [^5]。 #### 安全性总结 - **字符串必须以 `\0` 结尾**。 - **确保传入的指针非空**。 - **考虑使用 `strncmp` 替代 `strcmp`**。 - **对外部输入进行预处理和验证**。 - **必要时实现自定义比较函数以增强控制**。 通过遵循上述实践,可以有效提升 `strcmp` 函数在实际应用中的安全性,减少潜在的运行时错误和安全漏洞。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值