C语言中字符串之间的比较【char*】/【string】

简介: C语言中字符串之间的比较【char*】/【string】

在C/C++语言中表示字符串的方式有两种:


1、char* a  

2、string b


对于这两种方式各自之间比较又是怎么处理的呢?


我们知道,数值直接进行比较,直接用'>'、'<'、'=='来判断。而对于一串字符这样比较对不对呢?


1、对于char*


首先定义几个字符串:    

//test

char* b = "acd";

char* a = "abc";

char* a1= "abc";    

char* c = a;


①、如下比较,如果单从定义内容上看,结果是不是应该都会输出?

  if (a==a1)
  {
    cout<<"a=a1"<<endl;
  }
  if (a==c)
  {
    cout<<"a=c"<<endl;
  }

真正结果是仅输出了a=c


②、再看下面a和b的比较,结果又是什么呢?单从内容上看‘acd’是不是大于‘abc’呢,即a<b?

  if (a>b)
  {
    cout<<"a>b"<<endl;
  }
  else if (a<b)
  {
    cout<<"a<b"<<endl;
  }
  else{
    cout<<"a=b"<<endl;
  }

最后结果是:a>b

以上结果都怎么解释?来,我们看一下他们的内存空间就一切都明白了(主要还是要了解指针含义):

1.png

我们不难发现,字符串使用'>'、'<'、'=='来比较最终比较的其实是他们指向的内存地址。b指向的内存地址0x34,小于a指向的内存地址0x84,即做比较发现a>b;而a赋值给c,那么c指向的内存地址也是0x84,故a=c;a1其实与a只是内容相同,但指向地址空间不同,直接‘==’其实他们不相等。


那么正确的比较是怎么样的呢?

image.png

是的,我们应该通过strcmp函数来比较char*型字符串的比较。


strcmp() 用来比较字符串(区分大小写),其原型为:


int strcmp(const char *s1, const char *s2);

【参数】s1, s2 为需要比较的两个字符串。


字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,若差值不为0 则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。


【返回值】若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值。s1 若小于s2 则返回小于0 的值。


注意:strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符;如果考虑到本地化的需求,请使用 strcoll() 函数。


另外,strcasecmp()函数也可用于判断字符串是否相等,但自动忽略大小写。strcasecmp()用来比较参数s1 和s2 字符串,比较时会自动忽略大小写的差异。


2、对于string


string类型的字符串作比较则相对简单,首先定义一些字符串:

string aa = a;

string bb = "abc";

string cc = "acd";

       其内存是:

image.png

可见内部直接是存储的字符内容的。


那么直接比较会怎么样?

1.  if (aa > cc)
  {
    cout<<"aa > cc"<<endl;
  }
  else if (aa < cc)
  {
    cout<<"aa < cc"<<endl;
  } 
  else
  {
    cout<<"aa = cc"<<endl;
  }

结果是:aa<cc。是正确的呀,说明string类型的字符串是可以拿来直接比较的。


当然在查找过程中也发现string类型的字符串比较还可以用compare()函数来进行。


compare()函数重载较多,其用例主要有:


1、int n = aa.compare(cc);

2、int n = aa.compare(1,2,cc);// 1代表aa的下标,2代表数量 意思为 aa字符串中下标为1开始 字符数量为2的字符串‘bc’与cc相比;

3、int n = aa.compare(1,2,cc,0,2);//意思为 aa字符串中下标为1开始 字符数量为2的字符串‘bc’与cc字符串中下标为0开始 字符数量为2的字符串‘ac’相比;


n=0表示比较的字符串相等,n>0表示aa'大于cc',n<0表示aa'小于cc'。


3、char*和string两者是可以相互转换的,为此在比较前重新定义对应变量并赋值即可,然后使用自己熟悉的比较方法进行比较就行了。


两者转换方法则可以参考:

C++中string、char *、char[]之间数据类型相互转换方法_nanke_yh的博客-CSDN博客

https://blog.csdn.net/nanke_yh/article/details/102769546

目录
相关文章
|
1月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
46 1
|
15天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
15天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
19天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
24天前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
24天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
27天前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
51 0
|
27天前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
42 0
|
1月前
|
存储 JSON NoSQL
揭秘Redis字符串String的隐藏技能!从基础到进阶,让你的数据存储操作秒变高大上!
【8月更文挑战第24天】Redis中的字符串类型作为其基石,不仅能够存储从简单文本到复杂格式如JSON的各种数据,还能通过多样化的命令实现包括但不限于自增自减、设置过期时间等高级功能,极大提升了其实用性和灵活性。例如,使用`SET`命令可添加或更新键值对,`GET`获取值,`DEL`删除键;同时,`INCR`和`DECR`支持对整数值的原子性增减操作,非常适合实现计数器等功能;通过`EXPIRE`命令设置过期时间,则适用于需要限时存储的应用场景。尽管名为“字符串”,但实际上还可存储图片、音频文件的Base64编码等形式的数据,为开发者提供了强大而灵活的工具。
33 0
|
1月前
|
存储 Java