嵌入式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;
}

函数运行结果如下: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/756166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 HAL库 外部中断 实现按键控制LED亮灭

目录 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 2、NVIC嵌套向量中断控制器 3、EXTI外部中断 4、项目的硬件排线 5、STM32CUBE_MX配置 6、HAL库代码 7、实际效果 1、为什么使用GPIO外部中断控制LED亮灭&#xff1f; 实现LED亮灭控制有很多方式&#xff0c;其中…

等保2.0安全计算环境解读

等保2.0&#xff0c;即网络安全等级保护2.0制度&#xff0c;是中国为了适应信息技术的快速发展和安全威胁的新变化而推出的网络安全保护标准。相较于等保1.0&#xff0c;等保2.0更加强调主动防御、动态防御和全面审计&#xff0c;旨在实现对各类信息系统的全面保护。 安全计算环…

自适应响应式瓷砖地板建材网站源码pbootcms模板

模板介绍 一款全面的自适应响应式瓷砖地板建材网站源码pbootcms模板。该模板兼容所有浏览器&#xff0c;整站源码下载&#xff0c;可以帮您节约建站成本&#xff0c;以高质量高效率完成网站的设计创建。 模板截图 源码下载 自适应响应式瓷砖地板建材网站源码pbootcms模板

IDEA错误:command line is too long 命令行过长

今天运行程序时遇到了一个错误&#xff0c;提示如下&#xff1a; 那么话不多说&#xff0c;如何解决呢&#xff1f; 首先点击右上角的编辑配置 点击修改选项 点击缩短命令行 选择JAR清单 好了&#xff0c;问题解决

数据分析-常用模型-RFM模型

一、RFM模型的底层逻辑 漏斗模型中&#xff0c;大部分业务都是按流程推进&#xff0c;可以做漏斗分析。但是&#xff0c;大家有没有想过一个问题&#xff1a; 如果没有转化过程记录&#xff0c;该怎么办&#xff1f;如果用户行为频率很高&#xff0c;有几十个漏斗&#xff0c…

AI与音乐的结合

前言 毫无疑问,AI的发展已经在音乐领域带来了诸多变化和影响.但人类创作仍然具有不可替代的重要性。人类的灵感、创造力以及对音乐的深刻理解和情感表达是音乐产业的核心动力来源。AI 更倾向于被视为一种辅助工具&#xff0c;与人类创作者相互协作和融合&#xff0c;共同推动音…

Python28-1 机器学习算法之决策树

决策树&#xff08;Decision Tree&#xff09; 决策树算法是一种常用的机器学习算法&#xff0c;属于监督学习范畴。它可以用于分类和回归任务&#xff0c;具有易于理解和解释的特点。决策树通过递归将数据分割成更小的子集&#xff0c;构建一个树形结构&#xff0c;其中每个节…

侯捷C++面向对象高级编程(上)-2-构造函数

1.inline函数 2.访问级别 3.构造函数 4.重载

《mysql篇》--查询(进阶)

目录 将查询结果作为插入数据 聚合查询 聚合函数 count sum group by子句 having 联合查询 笛卡尔积 多表查询 join..on实现多表查询 内连接 外连接 自连接 子查询 合并查询 将查询结果作为插入数据 Insert into 表2 select * from 表1//将表1的查询数据插入…

大模型知识库的使用

大模型知识库的使用通常涉及以下几个方面&#xff0c;使用大模型知识库可以提高信息检索的准确性和效率&#xff0c;促进知识的传播和应用。同时&#xff0c;也需要关注知识库的质量和更新&#xff0c;以确保提供的知识是准确和可靠的。北京木奇移动技术有限公司&#xff0c;专…

苏东坡传-读书笔记四

长江三峡&#xff0c;无人不知其风光壮丽&#xff0c;但对旅客而言&#xff0c;则是险象环生。此段江流全长二百二十余里&#xff0c;急流旋涡在悬崖峭壁之间滚转出入&#xff0c;水下暗石隐伏&#xff0c;无由得见&#xff0c;船夫要极其敏捷熟练&#xff0c;才可通行。三峡之…

使用shell脚本编写监控系统资源(CPU,内存,磁盘)使用情况

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 1.本章目标 2.编写脚本 1.获取内…

关于vs code中Live Server插件安装后无法打开的问题

一、问题情况 安装好Live Server插件之后&#xff0c;点击open with live server只会出现界面右下角落的提示&#xff0c;但是不会跳转到浏览器的页面&#xff1a;如下所示&#xff1a; 二&#xff1a;解决步骤 1、首先进行扩展设置&#xff0c;默认将浏览器的设置为chrome浏览…

The difference between Manhattan distance and Cosine Distance

题意&#xff1a;为什么即使返回了相同的文本块&#xff0c;曼哈顿距离&#xff08;Manhattan Distance&#xff09;和余弦距离&#xff08;Cosine Distance&#xff09;之间还是存在差异&#xff1f; 问题背景&#xff1a; I am using the qdrant DB and client for embeddin…

Pytorch实战(二)

文章目录 前言一、LeNet5原理1.1LeNet5网络结构1.2LeNet网络参数1.3LeNet5网络总结 二、AlexNext2.1AlexNet网络结构2.2AlexNet网络参数2.3Dropout操作2.4PCA图像增强 前言 参考原视频&#xff1a;哔哩哔哩。 一、LeNet5原理 1.1LeNet5网络结构 LeNet-5&#xff0c;其中&…

如何安装和卸载软件?

如何安装和卸载软件&#xff1f; &#x1f4bb; 如何安装和卸载软件&#xff1f;——默语的详细教程摘要引言正文内容&#x1f5a5;️ 在Windows上安装和卸载软件安装软件卸载软件 &#x1f34f; 在Mac上安装和卸载软件安装软件卸载软件 &#x1f914; QA环节&#x1f4dd; 表格…

访客(UV)、点击量(PV)、IP、访问量(VV)概念

1、https://www.cnblogs.com/QingPingZm/articles/13855808.htmlhttps://www.cnblogs.com/QingPingZm/articles/13855808.html

智慧校园-档案管理系统总体概述

智慧校园档案管理系统&#xff0c;作为教育信息化进程中的重要一环&#xff0c;它运用现代信息技术的力量&#xff0c;彻底改变了传统档案管理的面貌&#xff0c;为学校档案资源的收集、整理、存储、检索与利用开辟了全新的途径。这一系统全面覆盖学生、教职工、教学科研及行政…

今天天气正好,开锐界L去追风

早就想开着它来个惬意的自驾游&#xff0c;结果因为工作原因一直在忙东忙西&#xff0c;锐界L这车都是上下班代步使用&#xff0c;今天终于空闲下来了&#xff0c;带着它来郊区转一圈&#xff0c;顺便交一篇极其不正式的游记吧&#xff0c;写的不好。 本来打算去的远一点&…

mybatis的高级映射

mybatis的高级映射(重点) 表与表之间的关系&#xff1a; 一对一关系&#xff1a; 栗子&#xff1a;一个人对应一个身份证号 一对多关系&#xff1a; 栗子&#xff1a;一个用户可以有多个订单 1. 分析需求&…