标准C库之strcmp,strncmp函数(比较两个C风格字符串,比较两个字符串前n个字符)

前言

如果,想要深入的学习标准C库中strcmp,strncmp函数,还是需要去自己阅读Linux系统中的帮助文档。

具体输入命令:

man 3 strcmp/strncmp

即可查阅到完整的资料信息。

strcmp 函数

strcmp函数是标准C库(C Standard Library)中的一个用于比较字符串的函数。它的原型定义在<string.h>头文件中。

  • strcmp函数比较两个C风格字符串(以空字符’\0’结尾的字符数组),并根据比较结果返回一个整数值。

函数原型如下:

#include <string.h>//使用此函数需要导入此头文件
int strcmp(const char *str1, const char *str2);

参数:

  • 其中,str1和str2是指向两个需要比较的字符串的指针。

返回值:

  • 如果str1和str2相等(即两个字符串具有相同的字符并以空字符’\0’结尾),则strcmp返回0。
  • 如果str1在字典顺序上小于str2(即str1的第一个不同字符的ASCII值小于str2的对应字符),则strcmp返回一个负整数。
    如果str1在字典顺序上大于str2(即str1的第一个不同字符的ASCII值大于str2的对应字符),则strcmp返回一个正整数。

用法示例

下面是一些使用strcmp函数的示例:

判断两个字符串是否相等:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "hello";
    char str2[] = "world";
    char str3[] = "hello";

    if (strcmp(str1, str2) == 0) {
        printf("str1 and str2 are equal\n");
    } else {
        printf("str1 and str2 are not equal\n");
    }

    if (strcmp(str1, str3) == 0) {
        printf("str1 and str3 are equal\n");
    } else {
        printf("str1 and str3 are not equal\n");
    }

    return 0;
}

对字符串进行排序:

#include <stdio.h>
#include <string.h>

void sort_strings(char arr[][100], int n) {
    char temp[100];
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (strcmp(arr[i], arr[j]) > 0) {
                strcpy(temp, arr[i]);
                strcpy(arr[i], arr[j]);
                strcpy(arr[j], temp);
            }
        }
    }
}

int main() {
    int n = 4;
    char arr[][100] = {"orange", "apple", "banana", "grape"};

    sort_strings(arr, n);

    for (int i = 0; i < n; i++) {
        printf("%s\n", arr[i]);
    }

    return 0;
}

请注意,当使用strcmp函数时,需要确保传入的字符串指针有效且指向以空字符'\0'结尾的字符数组,否则可能导致未定义行为。 也是就说,这个函数对比的字符数组是2个C风格的字符串(以空字符’\0’结尾的字符数组)

如果说,strcmp函数比较的不是两个C风格字符串会发生什么?

如果strcmp函数比较的不是两个以空字符’\0’结尾的C风格字符串,那么它可能导致未定义行为(Undefined Behavior)。

  • 在这种情况下,程序可能表现出不稳定的行为,例如崩溃、错误输出或其他不可预测的结果

  • 当strcmp函数进行字符串比较时,它依赖于空字符’\0’作为字符串结束的标志。如果字符串没有以’\0’结尾,strcmp会继续比较后面的内存地址,直到遇到一个’\0’字符。这可能会导致访问非法内存区域,从而引发程序崩溃(如访问越界)或泄露敏感信息(如访问其他变量的内存空间)。

  • 要避免这种情况,请确保在使用strcmp函数之前始终检查字符串是否以’\0’结尾。如果不能确定字符串是否以空字符结尾,可以考虑使用其他字符串处理函数,例如strncmp,它允许指定要比较的最大字符数,从而避免潜在的未定义行为。

strncmp 函数

strncmp函数是标准C库(C Standard Library)中的一个用于比较字符串的函数。与strcmp函数类似,strncmp函数也用于比较两个C风格字符串(以空字符’\0’结尾的字符数组),但它只比较前n个字符。strncmp函数的原型定义在<string.h>头文件中。

函数原型如下:

int strncmp(const char *str1, const char *str2, size_t n);

参数:

  • 其中,str1和str2是指向两个需要比较的字符串的指针,n是要比较的最大字符数。
  • size_t是无符号整数类型,用于表示对象的大小。

返回值:

  • 如果str1和str2的前n个字符相等(或者在比较过程中遇到了空字符’\0’),则strncmp返回0。
  • 如果str1在字典顺序上小于str2(即str1的第一个不同字符的ASCII值小于str2的对应字符),则strncmp返回一个负整数。
  • 如果str1在字典顺序上大于str2(即str1的第一个不同字符的ASCII值大于str2的对应字符),则strncmp返回一个正整数。

用法示例

下面是一些使用strncmp函数的示例:

  • 比较两个字符串的前3个字符:
#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "hello";
    char str2[] = "helicopter";

    if (strncmp(str1, str2, 3) == 0) {
        printf("The first 3 characters of str1 and str2 are equal\n");
    } else {
        printf("The first 3 characters of str1 and str2 are not equal\n");
    }

    return 0;
}
  • 使用strncmp来安全地比较两个可能没有以空字符’\0’结尾的字符串:
#include <stdio.h>
#include <string.h>

int main() {
    char str1[10];
    char str2[10];

    // 假设这两个字符串来自某个不可信的来源,并且可能没有以'\0'结尾
    strncpy(str1, "hello", 5);
    strncpy(str2, "helicopter", 5);

    if (strncmp(str1, str2, 5) == 0) {
        printf("The first 5 characters of str1 and str2 are equal\n");
    } else {
        printf("The first 5 characters of str1 and str2 are not equal\n");
    }

    return 0;
}

请注意,当使用strncmp函数时,需要确保传入的字符串指针有效。虽然strncmp函数在比较时限制了最大字符数,但如果指针无效,依然可能导致未定义行为

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宋同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值