c语言中字符串比较的库函数是什么

news/2024/11/9 9:58:15/

说起比较运算,肯定第一时间想到了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://www.ppmy.cn/news/234550.html

相关文章

久戴不痛的蓝牙耳机有哪些?公认佩戴最舒适的无线蓝牙耳机推荐

现在的蓝牙耳机有着各种各样的性能&#xff0c;佩戴舒适也成为了人们选择蓝牙耳机的重要性能之一。戴着舒服&#xff0c;久戴不痛的蓝牙耳机有哪些&#xff1f;符合人体工学设计&#xff0c;轻便小巧&#xff0c;佩戴稳固的蓝牙耳机受到了不少人的欢迎。下面&#xff0c;我来给…

啥牌子的蓝牙耳机好?南卡、华为和漫步者蓝牙耳机

蓝牙耳机是人们不可缺的数码用品&#xff0c;出门在外或是玩游戏都离不开&#xff0c;随着国产TWS耳机的崛起&#xff0c;越来越多的人优先选择国产蓝牙耳机品牌&#xff0c;下面找来了当前市面上三款热门真无线蓝牙耳机&#xff0c;分别有南卡小音舱、华为FreeBuds 4E、漫步者…

2022年千元以下有哪些值得购买的蓝牙耳机?平价耳机深度测评,漫步者、南卡、Vivo、oppo、小米、三星、华为哪款最值得买?

许多朋友挑选无线蓝牙耳机的时候&#xff0c;并不知道自己到底需要什么样的无线蓝牙耳机&#xff0c;一心只想着性能最强可以节省时间的&#xff0c;但如若要找一款适合自己的蓝牙耳机&#xff0c;必要的参数对比是不能省的&#xff0c;所以今天我来一期蓝牙耳机测评&#xff0…

SpringMVC-【回顾】

回顾MVC架构 什么是mvc&#xff1a;模型、视图、控制器 -----软件设计规范 回顾servlet maven项目导入依赖&#xff08;webmvc,servlet-api,jsp-api,jstl,junit&#xff09;创建子模块&#xff0c;在子模块中添加框架支持&#xff08;在子模块中导入依赖jsp、servlet【因为父…

css常用的样式属性

CSS&#xff08;层叠样式表&#xff09;是用于网页排版的标记语言&#xff0c; 利用 CSS 可以控制网页中各个元素的布局、颜色、字体、边框等各种样式&#xff0c;下面是一些常用的 CSS 样式属性&#xff1a; background-color&#xff1a;设置背景颜色color&#xff1a;设置文…

Airpods左右耳音量不一样

戴耳机的场景有限&#xff0c;突然某一天连上mac后&#xff0c;总感觉左边没右边音量大&#xff0c;几次确认没听错&#xff0c;就开始搜索&#xff0c;搜出来一堆乱七八糟不靠谱的帖子 有说是耳机老化坏了的&#xff0c;这个可以换个设备连上看看是不是依然两边音量不一样大如…

Bragi App for Android,被苹果AirPods打到自闭,Bragi宣布终结分体耳机业务

现在再提起Bragi这个名字&#xff0c;大家都已经显得有些陌生&#xff0c;毕竟距离他们推出The Dash Pro耳机已经过去了两年时间。而最近面对自己毫无起色的分体耳机产品&#xff0c;Bragi也终于下定决心要砍掉这一产品线&#xff0c;并彻底退出可穿戴设备硬件市场。 Bragi的眼…

苹果 AirPods Pro如何打开空间音频?

平时我们听得最多的是“立体声”&#xff0c;那空间音频是什么呢&#xff1f;原来&#xff0c;空间音频是随苹果手机 iOS 14 一起配套为 AirPods Pro 耳机推出一种“沉浸式三维音频”。那如何才能体验到空间音频呢&#xff1f;需要的小伙伴一起来看看吧&#xff01; 具体步骤如…