C语言中字符串比较

article/2025/7/19 4:17:18

       在 单片机串口实现字符串命令解析 这篇文章中分析了在串口通信中如何去解析字符串命令,这篇文章就来讨论下字符串比较的方法都有哪些?

      说起比较运算,肯定第一时间想到了C语言中关于比较的相关运算符 “>、<、!=、>=、<=、==”,那么要比较两个字符串是否相等是不是直接用“==”比较就行了。下面就来看看这种方法行不行?

    先看一个例子

void main( void )
{char s1[] = "abc";char s2[] = "abc";    __asm( "sim" );                             //禁止中断SysClkInit();delay_init( 16 );LED_GPIO_Init();BEEP_GPIO_Init();Uart1_Init( 9600 );__asm( "rim" );                             //开启中断while( 1 ){if( s1 == s2 ){printf( "equal" );}else{printf( "Not equal" );}}
}

有两个字符串s1和s2,内容都是"abc",在if语句中通过"=="运算符进行比较。

         运行结果是s1和s2不相等,那为什么是不相等呢,通过右边的观察窗口可以看到,s1和s2是内部的两个存储空间,地址不一样,但是地址中的内容是一样的。那么用“ if( s1 == s2 )”这行语句去比较的时候,其实比较的是s1和s2的地址,不是比较地址中的内容,而s1和s2的地址是不相同的。

要比较内容的话,代码需要修改一下。

  if(( s1[0] == s2[0] )&&( s1[1] == s2[1] )&&( s1[2] == s2[2] )){printf( "equal" );}else{printf( "Not equal" );}

将代码修改为依次比较字符串中的内容

通过字符串的每一位依次比较,这样的比较方式,就可以判断出字符串相等。

将字符串数组改为指针看看

        将s1和s2改为指针,可以看到通过"=="比较,结果是相等的。通过右边的观察窗口可以看出s1和s2的地址是相同的,也就是这两个字符串指向了同一个地址空间。说明此时比较的还是地址,而不是地址中的内容。我们需要比较的是内容。

将代码修改为获取指针的内容,发现比较结果也是相等的。那么能不能说明这种比较方法是可以的。将字符串内容修改一下在看看。

内容改变后,指针的地址也发生了改变,此时"s1==s2"语句就不成立了。

但是这时候"*s1==*s2"依然是相等的,这是为什么呢?通过右侧的观察窗口可以看到,此时*s1和*s2的内容是"a",而不是整个字符串的内容。说明这行代码比较的是字符串的第一个字符,而不是整个字符串。那么要比较整个内容的话,还得每个字符挨个比较。

通过上面的分析可能会有一个疑问,为什么用"=="运算符比较单个字符的时候比较的就是内容,而比较字符串的时候,比较的却是地址?

        这就要说下一字符串在C语言中比较特殊的一点,在C语言中处理一般的变量如整形、字符型、浮点型时,直接操作的是变量的值,比如 int a,b; a=b;在执行这行代码的时候,是将b的值拷贝一份然后复制给a。比较运算符“==”在使用的时候,也直接比较的是变量的值。而C语言在使用字符串的时候,是通过地址引用而不是值引用来操作的。

       通过数组定义的字符串,系统分配的是两个不同的地址,虽然内容相同,但是实际上地址是不相同的,通过相等运算符"=="比较时,比较的是s1和s2本身的值,s1和s2本身的值是一个地址,这两个地址不同,所以比较结果就不相等。

        用指针定义的两个字符串,系统分配的是同一个地址空间,说明虽然他们的名字不一样,但是实际上是共用了同一个地址。通过相等运算符"=="比较时,比较的是s3和s4本身的值,s3和s4本身的值是一个地址,这两个地址相同,所以比较结果相等。

通过上面的分析,发现在处理字符串的时候不能直接用"=="运算符去比较,那么要如何去比较呢?

可以直接使用 C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

该函数返回值如下:

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

strcmp函数实际上是对字符的ASCII码进行比较,实现原理如下:首先比较两个串的第一个字符,若不相等,则停止比较并得出两个ASCII码大小比较的结果;如果相等就接着 比较第二个字符然后第三个字符等等。

这个函数其实就是相当于把上面例程中对字符串每个字符独立比较方法的一个封装,内部函数实现方式类似于下面这样。

由于字符串在C语言中的处理比较特殊,所以C语言提供了一个专门操作字符串的库。关于字符串的操作在"string.h"这个头文件中可以看到。

有字符串增加,字符串删除,字符串拷贝,字符串比较,字符串查找等等各种功能的函数封装,这样在处理字符串的时候就可以直接调用库函数来实现。

比如在处理串口命令的时候,如果串口命令为字符串,就可以直接用字符串比较命令去实现。

 if ( strcmp( uartRecStr, "led1 on" ) == 0 ){led1_on();}else if ( strcmp( uartRecStr, "led1 off" ) == 0 ){led1_off();}else if ( strcmp( uartRecStr, "led2 on" ) == 0 ){led1_off();}else if ( strcmp( uartRecStr, "led2 off" ) == 0 ){led1_off();}

将接收到字符串和指定的字符串比较,如果字符串相等,就调用相关的函数,这样通过if语句就可以简单的处理串口的指令。

不过通过if语句比较的话,程序的分支太多,程序看起来比较臃肿,能不能用switch语句去实现呢?但是switch语句中不支持字符串的比较直接比较,那要怎么实现?

char *cmdStr[] = {"led1 on", "led1 off", "led2 on", "led2 off"};  //字符串命令数组
len = sizeof( cmdStr ) / sizeof( cmdStr[0] );       //计算字符串个数for( i = 0; i < len; i++ ){if( strcmp( uartRecStr, cmdStr[i] ) == 0  ){switch( i )//分支语句不支持字符串,通过字符串数组的下标确定是哪个字符串。{case 0:led1_on();break;case 1:led1_off();break;case 2:led2_on();break;case 3:led2_off();break;default:break;}}}

可以将字符串存储在数组中,通过数组的下标去调用不同的字符串,然后使用字符串比较函数去判断字符串,这样switch语句的分支判断就可以转换为字符串的下标。

通过这种方法就可以直接在串口中处理简单的通信命令了。


http://chatgpt.dhexx.cn/article/Jm578nfb.shtml

相关文章

【C语言】正确比较两个字符串

目录 两种常见的错误比较方法 &#xff08;1&#xff09;为什么两个字符串不能直接用大于小于号比较&#xff1f; &#xff08;2&#xff09;为什么不能用数组名直接比较 字符串比较大小的实质 两种比较字符串两种方法 &#xff08;1&#xff09;难的方法 &#xff08;2&…

课程设计:Java编写的基于KNN算法的手写数字识别软件

0x00 概述 本软件是使用Java语言编写的PC端图形界面程序&#xff0c;也支持命令行形式运行 主要功能为识别用户在软件内绘板上手写的数字 同时也支持使用给定的训练集批量识别符合本软件定义格式的手写数字&#xff08;该功能仅支持命令行形式使用&#xff09; 0x01 设计逻…

手写数字识别问题(5)——完结

经过接近15周的艰苦努力&#xff0c;毕业设计&#xff08;基于MATLAB的手写数字识别系统&#xff09;已经完结。 设计过程中遇到的部分问题可查阅博客&#xff1a; 手写数字识别问题&#xff08;1&#xff09;——关于MNIST数据集手写数字识别问题&#xff08;2&#xff09;—…

常用的OCR文字识别软件有哪些

随着大家办公需求的增加&#xff0c;办公软件如雨后春笋般纷纷面世&#xff0c;旨在提高大家的工作效率&#xff0c;OCR文字识别软件便是不可缺少的办公软件之一。那么&#xff0c;有哪些专业又好用的OCR文字识别软件呢&#xff1f;小编来为大家推荐几款&#xff0c;以供参考。…

安卓实现扫一扫识别数字

本文已授权微信公众号&#xff1a;鸿洋&#xff08;hongyangAndroid&#xff09;原创首发。 公司业务需求&#xff0c;需要做手机号码的识别。所以有了此篇文章&#xff0c;现在就将实现过程分享给大家。 1.准备工作 首先实现识别数字等字符&#xff0c;我们要知道需要采用OC…

ABBYY FineReader15最新版图片文字识别转换软件

在日常生活中&#xff0c;我们会遇到需要将各种文字、图片、扫描图片等转换为文字的情况。想要轻松解决这些问题&#xff0c;需要使用到OCR文字识别。但对于许多新手来说&#xff0c;OCR文字识别是陌生的。今天小编就给大家介绍一下&#xff0c;OCR文字识别怎么使用&#xff0c…

数字识别代码完整

数字识别代码 近期完成了一个数字识别的代码&#xff0c;开始也不会做&#xff0c;但通过了解和查询自己也了解到了一些在这你给大家做个分享&#xff08;本代码开发环境Opencv3&#xff09;这里分享给大家一个比较好的网址&#xff0c;我的代码也是参照的这个改动的完整的代码…

Labview OCR数字识别

::: keywords labview,OCR,灰度,对比度,数字识别 ::: 下载文件 前言 OCR &#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是指电子设备&#xff08;例如扫描仪或数码相机&#xff09;检查纸上打印的字符&#xff0c;通过检测暗、亮的模式确定…

ABBYY15免费照片识别文字识别软件

照片识别文字的软件有哪些&#xff1f;在日常的工作的时候&#xff0c;小伙伴们是不是经常会借助拍摄照片记录一些比较重要的事情或者是一些比较重要的笔记&#xff0c;等回头空闲出来的时候在去整理&#xff0c;那么这时候&#xff0c;如果我们运用好图片识别文字这项技术&…

ABBYY FineReader15最新专业的PDF OCR图片文字识别软件

ABBYY FineReader PDF15是专业的OCR图片文字识别软件&#xff0c;可以快速、准确、方便地将扫描纸质文件、PDF格式及数字或移动电话图像转换成可编辑格式——Microsoft Word、Excel、PowerPoint、可检索的PDF、HTML、DjVu等。99.8%的识别准确率即刻识别文本&#xff0c;复制和粘…

怎么识别数字?看看这些识别软件能不能帮上你

随着数字时代的到来&#xff0c;数字在我们的生活中出现的频率也在不断的提高&#xff0c;而数字识别在我们的生活中也有了越来越重要的作用&#xff0c;给大家举个例子&#xff0c;当我们在商店购物时&#xff0c;往往需要使用银行卡进行支付&#xff0c;在这个过程中&#xf…

完全免费的OCR文字识别软件

今天我要分享给大家的是两款完全免费的OCR文字识别软件&#xff0c;而且这两款软件都是本地版无需联网就能使用&#xff0c;而且没有使用次数的限制。 软件准备好了&#xff1a; 链接: 百度网盘 请输入提取码 提取码: 6666 01软件信息 软件名称&#xff1a;OCR文字识别软件 …

基于BP神经网络手写体数字识别的软件设计

目 录 1 绪论 1 1.1 字符识别概述 1 1.2 手写数字识别的意义和应用前景 2 1.3 字符识别的研究与发展 3 1.4 手写数字识别的难点 3 1.5 国内外研究现状 4 1.6 手写体数字识别系统概述 5 1.7 本文内容安排 6 2 手写体数字识别中预处理技术 8 2.1 平滑去噪 8 2.2 二值化 10 2.3 归…

bp神经网络_BP 神经网络驱动的手写体数字识别软件 EasyOCR

EasyOCR 项目介绍 本软件是一个手写体数字识别软件&#xff0c;采用BP神经网络&#xff0c;基于colt数学库&#xff0c;有完整源码&#xff0c;可以保存训练结果&#xff0c;基于开源例程neuralnetwork-sample&#xff0c;原作可以在GitHub中找到。主要改进了训练结果保存&…

opencv 数字识别详细教程

最近要做数字识别这块&#xff0c;但是自己又完全不懂这个&#xff0c;网上搜资料搜了好多&#xff0c;但是都没找到完整代码。只有自己慢慢搞&#xff0c;下面写下自己的过程以及代码有不好的地方希望大神可以指出&#xff0c;大家相互交流下。有需要完整代码的可以自行下载&a…

FPGA实现mnist手写数字识别(软件部分)

文章目录 FPGA实现mnist手写数字识别① 环境配置② 数据集及代码下载③ 代码操作&#xff08;1&#xff09;训练模型&#xff08;2&#xff09;权重输出&#xff08;3&#xff09;关于灰度转换 FPGA实现mnist手写数字识别 ① 环境配置 使用的环境&#xff1a;tf1.12&#xff…

pyqt5手写板+pytorch卷积神经网络,实现手写数字识别软件

卷积神经网络的结构 #定义网络结构 #不是le-net5的结构 class Net(nn.Module):def __init__(self):super(Net, self).__init__()# Sequential表示在搭建网络模型中要执行的一系列的步骤# Dropout中,p0.5表示50%的神经元不工作# layer3:输出层 一般输出层中不需要加Dropout# Co…

使用Dl4j训练的一个手写数字识别软件

DL4J使用之手写数字识别 最近一直在学习深度学习&#xff0c;由于我是Java程序员出身&#xff0c;就选择了一个面向Java的深度学习库—DL4J。为了更加熟练的掌握这个库的使用&#xff0c;我使用该库&#xff0c;以MNIST(http://yann.lecun.com/exdb/mnist/)手写数字数据集作为…

识别数字的软件有哪些?这几款识别数字工具安利给你

嘿&#xff0c;朋友们&#xff0c;你们有没有遇到过需要处理大量数字的情况&#xff0c;要是一个一个手动输入感觉十分麻烦&#xff0c;还会耗费大量时间和精力&#xff1f;别着急&#xff0c;现在数字识别的软件已经非常发达了&#xff0c;只需要一款好用的数字识别软件&#…

这款数字识别软件你知道吗

识别数字技术是指通过计算机自动识别数字的能力&#xff0c;通常采用数字图像处理和模式识别等技术进行实现。你别看这个技术好像很高大上&#xff0c;实际上现在已经有很多软件可以做到识别数字了&#xff0c;你知道识别数字的软件有哪些吗&#xff1f;今天我就为大家科普这项…