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

news2024/11/13 11:12:52

目录

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;
}

函数运行结果如下: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js实验指南:完善接口服务器

上一章接口服务器&#xff0c;我们实现了一个异常简单的接口服务器。可能很多人会感觉有点不真实的感觉&#xff0c;接口这么简单吗&#xff1f;没错&#xff0c;就这么简单。 我们在真实项目的前后端对接中&#xff0c;调用接口&#xff0c;拿到数据&#xff0c;就是如此而已…

20240624(周一)AH股行情总结:A股低开低走, 恒生科技指数跌2%,贵州茅台转跌为涨

内容提要 A股三大指数收盘均跌超1%&#xff0c;半导体、智慧医疗、商业航天概念领跌&#xff0c;中芯国际跌超3%&#xff0c;盘中一度涨2%。水电股逆势走强&#xff1b;白酒股低开高走&#xff0c;贵州茅台翻红&#xff0c;盘初曾跌3%。微盘股指数大跌4%。 正文 周一&#x…

社区便民团购小程序源码系统 前后端分离 带完整源代码包以及搭建部署教程

系统概述 随着移动互联网的快速发展&#xff0c;社区团购凭借其便利性、优惠性逐渐走进人们的生活&#xff0c;成为了日常生活不可或缺的一部分。为了满足市场对此类服务的需求&#xff0c;我们特别推出了一款社区便民团购小程序源码系统&#xff0c;该系统采用前后端分离架构…

高考选专业分析,裁员潮下计算机专业还值得选择吗?

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 选择大学专业是一项非常重要的决策&#xff0c;尤其是在当前外部环境变化及技术快速发展的背景下。对于“是否还应该选择计算机专业”这个问题&…

C#/.NET量化开发实现财富自由【4】实现EMA、MACD技术指标的计算

听说大A又回到了2950点以下&#xff0c;对于量化交易来说&#xff0c;可能这些都不是事儿。例如&#xff0c;你可以预判到大A到顶了&#xff0c;你可能早就跑路了。判断逃顶还是抄底&#xff0c;最简单的方式就是判断是否顶背离还是底背离&#xff0c;例如通过MACD&#xff0c;…

C语言基础笔记(全)

一、数据类型 数据的输入输出 1.数据类型 常量变量 1.1 数据类型 1.2 常量 程序运行中值不发生变化的量&#xff0c;常量又可分为整型、实型(也称浮点型)、字符型和字符串型 1.3 变量 变量代表内存中具有特定属性的存储单元&#xff0c;用来存放数据&#xff0c;即变量的值&a…

Java基础知识-线程

Java基础知识-线程 1、在 Java 中要想实现多线程代码有几种手段&#xff1f; 1. 一种是继承 Thread 类 2. 另一种就是实现 Runnable 接口 3. 最后一种就是实现 Callable 接口 4. 第四种也是实现 callable 接口&#xff0c;只不过有返回值而已 2、Thread 类中的 start() 和 …

有序充电在新能源行业的前景与应用

作为新能源汽车的基础动力装置&#xff0c;交流充电桩也是可以促使新能源汽车正常行驶的关键内容。近年来我国新能源汽车的增长速度出现明显的上升趋势&#xff0c;但是其充电桩的发展还比较缓慢。目前在充电桩系统设计期间仍存在一些问题&#xff0c;主要表现在充电设施短缺、…

2024年6月京东睡眠呼吸暂停和低通气事件检测赛题-baseline

赛题地址&#xff1a;DC竞赛-大数据竞赛平台 (datacastle.cn) 一、数据集介绍 train_x训练数据集特征描述&#xff0c;其样本分布不均匀&#xff0c;0样本29808&#xff0c;1样本3221&#xff0c;2样本4520&#xff0c;共计37549条样本 第一维度&#xff1a;60 位受试样本数总…

SSL证书在网站访问中的核心作用及快速申请指南

在当今的互联网时代&#xff0c;数据安全与用户隐私保护成为了网站运营不可或缺的一部分。SSL证书作为一种重要的网络安全协议&#xff0c;它在网站访问中扮演着至关重要的角色&#xff0c;主要体现在以下几个方面&#xff1a; 一、加密通信内容&#xff1a;SSL证书通过建立安…

2024年【G1工业锅炉司炉】考试及G1工业锅炉司炉考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G1工业锅炉司炉考试为正在备考G1工业锅炉司炉操作证的学员准备的理论考试专题&#xff0c;每个月更新的G1工业锅炉司炉考试题库祝您顺利通过G1工业锅炉司炉考试。 1、【多选题】TSGG0001-2012《锅炉安全技术监察…

MySQL实训

项目名称与项目简介 股票交易系统是一个综合性的金融服务平台&#xff0c;它提供了股票买卖、交易查询、用户管理、股票信息管理以及资金账户管理等功能。系统旨在为用户提供一个安全、高效、便捷的股票交易环境&#xff0c;让用户能够实时掌握市场动态&#xff0c;做出合理的…

golang项目基于gorm框架从postgre数据库迁移到达梦数据库的实践

一、安装达梦数据库 1、登录达梦数据库官网&#xff0c;下载对应系统版本的安装包。 2、下载地址为&#xff1a;https://www.dameng.com/list_103.html 3、达梦数据库对大小写敏感&#xff0c;在安装初始化数据库实例时建议忽略大小写&#xff1b;具体安装教程可参考以下博客: …

知不知行不行?

老树新芽&#xff0c; 结合最近几个观点&#xff0c;再拓展&#xff1a; Prompt & “Prompt—生成—选择” 事前提要求&#xff0c;事后决定满意不满意&#xff0c;中间尽量少干涉——老板对员工不也是这样吗&#xff1f;甲方对乙方不也是这样吗&#xff1f;都是后者在生…

VMware虚拟机移植保姆级教程

文章目录 前言:一、打包与备份二、VMware移植1. 文件介绍2. 移植过程总结:前言: 前几日对电脑做了一个大的更新升级,不仅将硬件进行了升级,还对电脑的软件进行了升级也就是我从Win10今家庭版升级到Win11专业版啦,之前没有升级是因为数据量很多,怕升级后找不到自己需要的…

vue-cli搭建过程

1.vue-cli 概述 vue-cli 官方提供的一个脚手架&#xff0c;用于快速生成一个 vue 的项目模板&#xff0c;预先定义好的目录结构及基础代码 举个例子吧&#xff01; 比如之前学过的Maven,在创建 Maven 项目时可以选择创建一个骨架项目&#xff0c;这个骨架项目就是脚手架&#x…

goLang小案例-打印99乘法表

goLang小案例-打印99乘法表 1. 打印99乘法表 func Print99multiplication1() {//横向9排for i : 1; i < 9; i {//竖向9列//第一批第一个 和第一列比较 如果大于排就结束//假设第三排i3 最走有三列 1*3 2*3 3*3//j3打印完 j 当j4就要结束 以此类推for j : 1; j < i; j …

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料

东兴市金顺心贸易有限公司联合越南名厨研发的阿吉贡河粉灵魂汤底料&#xff0c;一包汤底料竟然就能撑起一家店的灵魂&#xff01;&#x1f372; 简单的食材&#xff0c;却散发出不平凡的美味&#xff0c;仿佛带我穿越千里之外。每一口都是满满的幸福与满足&#xff0c;真心推荐…

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文档 ID 1492150.1)

Detailed Steps for Troubleshooting ORA-00600 [kdsgrp1] (文档 ID 1492150.1)​编辑转到底部 In this Document Purpose Troubleshooting Steps References APPLIES TO: Oracle Database - Enterprise Edition Oracle Database Cloud Schema Service - Version N/A and lat…

Stateflow快速入门系列(五): 通过广播事件同步并行状态

局部事件允许一个状态触发同一个 Stateflow图中另一个状态的转移或动作&#xff0c;从而使您能够协调并行状态。要将事件从一个状态广播到另一个状态&#xff0c;请使用 send 运算符以及事件的名称和激活状态的名称&#xff1a; send(eventName,stateName) 当您广播事件时&am…