嵌入式Linux系统编程 — 4.5 strcmp、strchr 等函数实现字符串比较与查找

目录

1 字符串比较

1.1 strcmp() 函数

1.2 strncmp() 函数

1.3 示例程序

2 字符串查找 

2.1 strchr() 函数

2.2 strrchr() 函数

2.3 strstr() 函数

2.4 strpbrk() 函数

2.5 示例程序


1 字符串比较

strcmp()strncmp() 函数是C语言标准库中用于比较两个字符串的函数。

1.1 strcmp() 函数

strcmp 进行字符串比较,主要是通过比较字符串中的字符对应的 ASCII 码值, strcmp 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现了不同的字符,或者某一字符串已经到达末尾(遇见了字符串结束字符' \0 ')。函数原型如下:

#include <string.h>

int strcmp(const char *str1, const char *str2);

参数:两个字符串 str1str2 

1.2 strncmp() 函数

strncmp()与 strcmp()函数一样,也用于对字符串进行比较操作,但最多比较前 n 个字符, strncmp()函数原型如下所示:

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

 参数:两个字符串 str1str2 

这两个函数都接受指针作为参数,指向要比较的字符串。strcmp() 比较两个完整的字符串,而 strncmp() 只比较每个字符串的前 n 个字符。两个函数的返回值如下:

  • 返回 0 如果两个字符串相等。
  • 返回小于 0 的值如果第一个字符串在字典序上小于第二个字符串。
  • 返回大于 0 的值如果第一个字符串在字典序上大于第二个字符串。

1.3 示例程序

下面的示例程序使用 strcmp()strncmp() 函数来比较两个用户输入的字符串。

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

#define MAX_STR_LEN 100 // 定义字符串的最大长度

int main() 
{
    char str1[MAX_STR_LEN], str2[MAX_STR_LEN]; // 存储用户输入的两个字符串
    int n; // 存储用户输入的参数n,用于strncmp()比较的字符数

    // 获取用户输入的第一个字符串
    printf("请输入第一个字符串:");
    fgets(str1, MAX_STR_LEN, stdin);
    str1[strcspn(str1, "\n")] = 0; // 去除末尾的换行符

    // 获取用户输入的第二个字符串
    printf("请输入第二个字符串:");
    fgets(str2, MAX_STR_LEN, stdin);
    str2[strcspn(str2, "\n")] = 0; // 去除末尾的换行符

    // 获取用户输入的参数n
    printf("请输入要比较的字符数n:");
    scanf("%d", &n);

    // 确保n不会超过字符串的最大长度
    n = n > MAX_STR_LEN ? MAX_STR_LEN : n;

    // 使用strcmp()函数比较两个完整字符串
    int strcmp_result = strcmp(str1, str2);
    printf("使用strcmp()比较两个完整字符串的结果:");
    if (strcmp_result == 0) {
        printf("两个字符串相等。\n");
    } else if (strcmp_result < 0) {
        printf("第一个字符串小于第二个字符串。\n");
    } else {
        printf("第一个字符串大于第二个字符串。\n");
    }

    // 使用strncmp()函数比较两个字符串的前n个字符
    int strncmp_result = strncmp(str1, str2, n);
    printf("使用strncmp()比较两个字符串的前%d个字符的结果:", n);
    if (strncmp_result == 0) {
        printf("两个字符串的前%d个字符相等。\n", n);
    } else if (strncmp_result < 0) {
        printf("第一个字符串的前%d个字符小于第二个字符串的前%d个字符。\n", n, n);
    } else {
        printf("第一个字符串的前%d个字符大于第二个字符串的前%d个字符。\n", n, n);
    }

    return 0;
}

程序首先使用 strcmp() 对两个完整字符串进行比较,然后使用 strncmp() 对两个字符串的前 n 个字符进行比较。运行结果如下:

2 字符串查找 

字符串查找在平时的编程当中也是一种很常见的操作,譬如从一个给定的字符串当中查找某一个字符或者一个字符串,并获取它的位置。 C 语言函数库中也提供了一些用于字符串查找的函数,包括 strchr()、strrchr()、 strstr()、 strpbrk()、 index()以及 rindex()等。下面是每个函数的作用和原型:

index()rindex()已被标准化的新函数取代,并且可能在某些编译器中不可用或在未来的C标准中被移除。

2.1 strchr() 函数

strchr() 函数在字符串中查找第一次出现指定字符的位置。函数原型如下:

#include <string.h>

char *strchr(const char *s, int c);
  • s:要搜索的字符串。
  • c:要查找的字符。

2.2 strrchr() 函数

strrchr() 函数从字符串末尾开始查找最后一次出现指定字符的位置,参数和返回值与 strchr() 相同,但是搜索方向是从末尾到开头。。函数原型如下:

#include <string.h>

char *strrchr(const char *s, int c);

  • s:要搜索的字符串。
  • c:要查找的字符

2.3 strstr() 函数

strstr() 函数在字符串中查找第一次出现子字符串的位置。函数原型:

char *strstr(const char *haystack, const char *needle);
  • haystack:要搜索的字符串。
  • needle:要查找的子字符串。

2.4 strpbrk() 函数

strpbrk() 函数在字符串中查找任意字符在另一字符串中首次出现的位置。函数原型如下:

char *strpbrk(const char *s1, const char *s2);
  • s1:要搜索的字符串。
  • s2:包含要查找的字符集的字符串。

2.5 示例程序

下面的示例程序使用 strchr()strrchr()strstr()strpbrk() 函数来查找字符或子字符串,并使用条件语句检查是否找到了它们。如果找到了,我们计算字符或子字符串的位置,并打印出来。

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

#define MAX_STR_LEN 100

int main() {
    char str[MAX_STR_LEN]; // 用户输入的源字符串
    char charToFind; // 用户希望查找的字符
    char substr[MAX_STR_LEN]; // 用户希望查找的子字符串
    char charsToBreak[MAX_STR_LEN]; // 用户希望用于strpbrk的字符集

    // 初始化字符串
    memset(str, 0, MAX_STR_LEN);
    memset(substr, 0, MAX_STR_LEN);
    memset(charsToBreak, 0, MAX_STR_LEN);

    // 获取用户输入的源字符串
    printf("请输入源字符串:");
    fgets(str, MAX_STR_LEN, stdin);
    str[strcspn(str, "\n")] = 0; // 去除末尾的换行符

    // 获取用户希望查找的字符
    printf("请输入要查找的字符:");
    scanf("%c", &charToFind);
    scanf("%*c"); // 清除缓冲区中的换行符

    // 获取用户希望查找的子字符串
    printf("请输入要查找的子字符串:");
    fgets(substr, MAX_STR_LEN, stdin);
    substr[strcspn(substr, "\n")] = 0; // 去除末尾的换行符

    // 获取用户希望用于strpbrk的字符集
    printf("请输入用于strpbrk的字符集(例如: 'abc123'):");
    fgets(charsToBreak, MAX_STR_LEN, stdin);
    charsToBreak[strcspn(charsToBreak, "\n")] = 0; // 去除末尾的换行符

    // 使用strchr查找字符
    char *chrPos = strchr(str, charToFind);
    printf("strchr找到的位置:%s\n", chrPos ? "找到" : "未找到");
    if (chrPos) {
        printf("位置:%zu\n", chrPos - str + 1); // 输出字符在字符串中的位置
    }

    // 使用strrchr从末尾查找字符
    chrPos = strrchr(str, charToFind);
    printf("strrchr找到的位置:%s\n", chrPos ? "找到" : "未找到");
    if (chrPos) {
        printf("位置:%zu\n", chrPos - str + 1); // 输出字符在字符串中的位置
    }

    // 使用strstr查找子字符串
    chrPos = strstr(str, substr);
    printf("strstr找到的子字符串位置:%s\n", chrPos ? "找到" : "未找到");
    if (chrPos) {
        printf("位置:%zu\n", chrPos - str + 1); // 输出子字符串在字符串中的位置
    }

    // 使用strpbrk查找任意字符在字符集中首次出现的位置
    chrPos = strpbrk(str, charsToBreak);
    printf("strpbrk找到的位置:%s\n", chrPos ? "找到" : "未找到");
    if (chrPos) {
        printf("位置:%zu\n", chrPos - str + 1); // 输出字符在字符串中的位置
    }

    return 0;
}

函数运行结果如下: 

  • 33
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

几度春风里

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

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

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

打赏作者

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

抵扣说明:

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

余额充值