C语言-strcmp(对比函数模拟和使用)

strcmp(对比函数模拟和使用)

strcmp的语法

 字符串的比较目的

这里比如你写一个网站,对照自己的用户和密码进行对比

使用(对比)方式

strcmp(arr1,arr2)

常量

arr1这里是常量 数组名是个地址所以是拷贝

所以不能这样对比

而是

常量字符串这里是把首字符给p 也就是首字符的地址给p

对比方式

如果要比较两个字符串的内容

比较逻辑 一一对应的比较

四种情况 这里比较的是内容

使用逻辑

上面的小于 返回值是-1

这里比较的对应ASCII码值的大小 遇见不一样的直接跳出循环 遇见一样但继续 一个一个进行对比 对比完进行下一个

返回数值逻辑 vs这里是-1 1 0 进行判断的 不一定一定是-1 1

 使用的代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
int main()
{char arr1[] = "sadaasd";char arr2[] = "sadaasd";char arr3[] = "sadasd ";char arr4[] = "sadasde";int ret1 = strcmp(arr1, arr2);//这里需要说明一下 是一个一个对应 什么意思呢就是 ss 对照  aa dd aa。。。所以返回0int ret2 = strcmp(arr1, arr3);//ss aa dd aa as这里是a的ASCII码值比s小 所以返回-1 此时不进行下面的循环int ret3 = strcmp(arr4, arr3);//这里的逻辑对比是一一对比,如果 前面的字符大 此时也就返回1 小的情况下 也就返回-1 相等的情况下 也就是整个字符串相等 返回0 printf("%d\n%d\n%d\n\n", ret1, ret2, ret3);printf("%d\n%d\n%d\n\n", ret1, ret2, ret3);
}

 

 代码讲解

`strcmp` 是一个在 C 语言中常用的字符串比较函数,它的作用是比较两个字符串的内容是否相同。`strcmp` 函数的定义通常在 `<string.h>` 头文件中,其原型如下:

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

`strcmp` 函数按照 ASCII 码的值逐个字符比较两个字符串。它的比较方式如下:
1. 从第一个字符开始比较,如果两个字符串的对应字符的 ASCII 码值相同,则继续比较下一个字符。
2. 如果两个字符串的对应字符的 ASCII 码值不同,`strcmp` 函数返回两个 ASCII 码值之间的差值的符号位,即如果第一个不同字符的 ASCII 码值在字符串1中大于字符串2中的对应字符,则返回正值;如果小于,则返回负值;如果相等,则继续比较下一个字符。
3. 如果在某个字符上比较结果不同,则函数停止比较并返回结果,不会等到字符串结束。
4. 如果两个字符串完全相同,`strcmp` 函数返回 `0`。
这里有一些例子来说明 `strcmp` 的比较方式:

// 比较 "hello" 和 "hello"
strcmp("hello", "hello") → 返回 0
// 比较 "hello" 和 "world"
strcmp("hello", "world") → 返回负值
// 比较 "hello" 和 "Hello" (注意大小写)
strcmp("hello", "Hello") → 返回负值
// 比较 "hello" 和 "hell" (较短的字符串)
strcmp("hello", "hell") → 返回正值

需要注意的是,`strcmp` 函数对比较的字符串大小写敏感。如果你需要进行不区分大小写的比较,可以使用 `strcasecmp` 函数(在 `<string.h>` 中定义)或者在 `strcmp` 函数中自己转换字符到小写或大写进行比较。
在使用 `strcmp` 函数时,应该注意比较的两个字符串都是以 `\0`(空字符)结尾的,因为如果两个字符串前缀相同,只有比较到字符串末尾或者发现一个字符不同时,`strcmp` 才会返回不同的结果。 

模拟实现(版本1)

这里加上const进行限制 防止进行修改

函数实现的逻辑 等于就继续 不等于就直接返回

在相等逻辑里面 进行判断 也就是同时遇见最后一个字符0 跳出循环

模拟实现(版本2)

不给予准确数值 返回就可以

模拟实现代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<string.h>
//这里采取的是两个模拟函数 也就是两个版本
int MY_strcmp(char* arr1, char* arr2)
{while (*arr1 == *arr2)这里代码循环的条件就是只要相等就继续++ 然后遇见最后一个字符'\0'自然会跳出循环{if (*arr1 == '\0')//遇见'\0'说明已经遇到最后一个字符了 也就可以跳出循环return 0;*arr1++; *arr2++;}return *arr1 - *arr2;//其他情况下 直接可以返回指针的差值不一定是非得是1 =1 0 这样的数值 因为每个编译器的返回数值是不一样的  我这里是vs的编译器
}
int my_strcmp(char* arr1, char* arr2)
{while (*arr1 == *arr2)//这里不能while(*arr1++==*arr2++)因为 这里是先++后等于 也就是 第一个元素和第二个元素的对比 所以不能这样的{if (*arr1 == '\0')//遇见'\0'说明已经遇到最后一个字符了 也就可以跳出循环{return 0;}*arr1++;//这里相等就继续++*arr2++;//同理}if (*arr1 > *arr2)//这里是按照*arr1也就是元素的ASCII码值进行对比的  如果大于 就返回1 小于就返回-1 不需要判断0 因为相等会继续循环{return 1;}else{return -1;}
}
int main()
{char arr1[] = "sadaasd";char arr2[] = "sadaasd";char arr3[] = "sadasd ";char arr4[] = "sadasde";int ret1 = strcmp(arr1, arr2);//这里需要说明一下 是一个一个对应 什么意思呢就是 ss 对照  aa dd aa。。。所以返回0int ret2 = strcmp(arr1, arr3);//ss aa dd aa as这里是a的ASCII码值比s小 所以返回-1 此时不进行下面的循环int ret3 = strcmp(arr4, arr3);//这里的逻辑对比是一一对比,如果 前面的字符大 此时也就返回1 小的情况下 也就返回-1 相等的情况下 也就是整个字符串相等 返回0 printf("%d\n%d\n%d\n\n", ret1, ret2, ret3);int ret4 = my_strcmp(arr1, arr2);int ret5 = my_strcmp(arr1, arr3);int ret6 = my_strcmp(arr4, arr3);printf("%d\n%d\n%d\n\n", ret4, ret5, ret6);//这里大家可以自己看看int ret7 = MY_strcmp(arr1, arr2);int ret8 = MY_strcmp(arr1, arr3);int ret9 = MY_strcmp(arr4, arr3);printf("%d\n%d\n%d", ret7, ret8, ret9);}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT网络编程之实现UDP广播发送和接收

推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#xff0c;作为入门科普和学习提升都不错&#xff0c;分享一下给大家&#xff1a;前言https://www.captainbed.cn/ai 一.UDP通信 1.QT中实现UDP通信主要用到了以下类&#xff1a;QUdpSocket、QHost…

Spring Boot 集成 WebSocket 实例 | 前端持续打印远程日志文件更新内容(模拟 tail 命令)

这个是我在 CSDN 的第一百篇原则博文&#xff0c;留念&#x1f60e; #1 需求说明 先说下项目结构&#xff0c;后端基于 Spring Boot 3&#xff0c;前端为 node.js 开发的控制台程序。现在希望能够在前端模拟 tail 命令&#xff0c;持续输出后端的日志文件。 #2 技术方案 #2.…

Ansible自动化运维Inventory与Ad-Hoc

前言 自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程&#xff0c;从而提高效率、降低成本&#xff0c;并减少人为错误。在当今复杂的IT环境中&#xff0c;自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansibl…

react native常用插件

react-native-async-storage/async-storage 说明&#xff1a;AsyncStorage 是一个在 react-native 中轻量存储的库&#xff1b;跟 localStorage 类似&#xff0c;API 也几乎一样&#xff1b;存储的时候需要将存储内容转成字符串存储。 react-navigation/material-bottom-tabs …

SwiftUI的textfile

SwiftUI的textfile 记录一下SwiftUI的textfile的基本使用方法 import SwiftUIstruct TextfileBootCamp: View {State var enterString ""State var enterList [String]()var body: some View {NavigationView(content: {VStack {/// 双向绑定输入的字符TextField(…

泽众云真机-机型支持ADB调试功能即将上线

最近云真机平台在线客服&#xff0c;收到很多咨询关于ADB调试功能&#xff0c;什么时候能更新&#xff1f;据小编所知&#xff0c;正在升级之中&#xff0c;有一块专门为了解决ADB调试功能提前准备&#xff0c;升级网络硬件设备&#xff0c;目前平台的功能已开发完成&#xff0…

使用docker-compose部署MySQL三主六从半同步集群(MMM架构)

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容部署MySQL三主六从半同步集群一主二从同步集群规划需要安装docker和docker-compose命令形式安装安装docker安装docker-compose 宝塔面板形式安装 部署node1节点的master1docker-compose.yaml文件my.cnf文件授权启动 部署no…

C# danbooru Stable Diffusion 提示词反推 Onnx Demo

目录 说明 效果 模型信息 项目 代码 下载 C# danbooru Stable Diffusion 提示词反推 Onnx Demo 说明 模型下载地址&#xff1a;https://huggingface.co/deepghs/ml-danbooru-onnx 效果 模型信息 Model Properties ------------------------- ----------------------…

OpenvSwitch VXLAN 隧道实验

OpenvSwitch VXLAN 隧道实验 最近在了解 openstack 网络&#xff0c;下面基于ubuntu虚拟机安装OpenvSwitch&#xff0c;测试vxlan的基本配置。 节点信息&#xff1a; 主机名IP地址OS网卡node1192.168.95.11Ubuntu 22.04ens33node2192.168.95.12Ubuntu 22.04ens33 网卡信息&…

2024/3/14打卡棋子(14届蓝桥杯)——差分

标准差分模板 差分——前缀和的逆运算&#xff08;一维二维&#xff09;-CSDN博客 题目 小蓝拥有 nn 大小的棋盘&#xff0c;一开始棋盘上全都是白子。 小蓝进行了 m 次操作&#xff0c;每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色&#xff0…

【数据结构与算法】(13):交换排序之冒泡排序和快速排序

&#x1f921;博客主页&#xff1a;Code_文晓 &#x1f970;本文专栏&#xff1a;数据结构与算法 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&…

StarRocks——滴滴的极速多维分析实践

背景 滴滴集团作为生活服务领域的头部企业&#xff0c;其中橙心优选经过一年多的数据体系建设&#xff0c;逐渐将一部分需要实时交互查询&#xff0c;即席查询的多维数据分析需求由ClickHouse迁移到了StarRocks中&#xff0c;接下来以StarRocks实现的漏斗分析为例介绍StarRocks…