爱美容
当前位置: 首页 美容百科

c++字符串比较大小规则(c++字符串比较函数)

时间:2023-06-05 作者: 小编 阅读量: 3 栏目名: 美容百科

02—三者之间的转换三者之间的转换1.string类如何转换为char*呢?首先必须了解,string可以被看成是以字符为元素的一种容器。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。注意,与char*不同的是,string不一定以NULL(‘’)结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

01

char[]和char*之间的比较和转换

在C++编程中,很多时候我们会遇到如何对char[]和char*进行比较,当然一般来说都是通过使用strcmp方法,当然看了C++ primer的话都知道不能使用“==”,那么先看看直接使用“==”是什么样的结果。

如下面的程序:

#includeusing namespace std;int main() {char arrTest1[] = "abc";char arrTest2[] = "abc";cout << (arrTest1== arrTest2) << endl;char *pTest1 = "abc";char *pTest2 = "abc";cout << (pTest1 == pTest2) << endl;}

这个程序的结果是:第一个打出的是0,而第二个打出的是1

问题分析:

那么为什么会有这种结果呢,首先需要知道的是这里“==”比较的不是指向的内容abc,

比较的是各个arrTest1和arrTest2对象中存储的是指向内容的地址,换句话说就是abc的地址,不是它们本身的存储的值。

Array对象

对Array对象来说,是运行时在栈空间上分配的内存,所以每个对象都是单独去申请内存,各自保存一份自己的abc,所以Array对象存储的地址也是不一样的,所以第一个结果是false;

Pointer对象

对Pointer对象来说,两个字符指针并没有分配相应的存储区,是后面的abc是以字符串常量的形式存在常量区,然后把首地址的值赋值给了Pointer对象,所以Pointer对象存储的地址应该来说是一样的,所以第二个结果是true;

我们可以想到通过打印相关的地址来查看结果是否正确,但这里会有个问题:

数组对象下面直接打印数组对象,其实是打印的数组对象的内容,结果都是abc

cout << arrTest1<< endl;cout << arrTest2<< endl;

对于数组对象可以这样打印数组的首地址,可以从这里看出这两个地址是不同的,即两个abc存储在不同的空间

cout << &arrTest1<< endl;cout << &arrTest2<< endl;

输出结果如下:

指针对象

下面直接打印指针对象,其实是打印的也是指针对象的内容,结果都是abc,这样打印按道理

来说应该是打印的字符串的首地址,是因为对cout进行了重载,打印字符指针时,给出地址

不是打印地址内容,而是打印相对的字符的内容,所以会得到abc结果

cout << pTest1 << endl; cout << pTest2 << endl;

但是如果取该指针的地址来打印的话,结果两个地址是不对的,因为此时打印的不是指向的字符串的首地址了,而是该指针变量的地址,当然不一样

cout << &pTest1 << endl; cout << &pTest2 << endl;

如果要获取指针对象的字符串的首地址的值的话,需要让cout输出符不认为它是一个字符指针,

这样就不会产生重载操作了,这样可以看到两个输出的地址是相同的

cout << (void*)pTest1<< endl; cout << (void*)pTest2<< endl;

输出结果如图:

那么直接比较char[]时,可以使用如下函数方式:

如果要比较的对象是char*字符串

int strcmp(const char* s1,const char* s2); char a[10]=”abc”,c[1000]=”abc”; printf(“%d”,strcmp(a,c)); //返回 0 表示相等

2. 如果要比较的对象是两个string,则利用函数compare() 或者 ==

s1.compare(s2)

3. 注意:

C++中string类型与char*类型的字符串比较的一种实例,使用strcmp比较时需先将string转换成char*类型再比较,此时可以用c_str()函数转换。

当然compare其中有一个重载如下,可以直接使用于string与char*或者与char[]进行对比

int compare (const char* s) const;
#include <iostream>#include <cstring>using namespace std;int main(void){const char *passwd = "ap_passwd";string str = "ap_passwd";cout<<"passwd="<<passwd<<", str="<<str<<endl;if ( str.compare(passwd) == 0){cout<<"The compare euqal!"<<endl;}else{cout<<"is not equal!"<<endl;}return 0;}运行:passwd=ap_passwd, str=ap_passwdThe compare euqal!

02

三者之间的转换

三者之间的转换

1. string类如何转换为char *呢?

首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL(‘’)结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

把string转换为char* 有3种方法:1.datastring str="abc";char *p=(char *)str.data();2.c_strstring str="gdfd";char *p=str.c_str();3. copystring str="hello";char p[40];str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置*(p+5)=''; //要手动加上结束符

2.char[]转换为string类

直接赋值即可。

3. string类转换为char[]

char *strcpy(char *a,const char *b){if(a == NULL || b == NULL)exit(0);char *c = a;while((*a++ = *b++) != '');return c;}char c[20];string s="1234";strcpy(c,s.c_str())
    推荐阅读
  • 他苦心修炼达到第二境界的小说(他拥有绝世功法)

    鸿凌看着眼前宛若疯魔的义兄,眼中闪过一丝不屑。黑衣人的呼吸刹那间急促起来,始祖之血,是修炼《九转玄功》的关键。以鸿凌目前重伤濒死的状态,便是大罗神仙来了,也根本不可能办得到。鸿凌看着这个骄傲的男子脸色阴晴不定,就知道,自己完全猜对了。鸿凌语不惊人死不休,他呵呵一笑,露出被血染红的整齐的牙齿。鸿凌娓娓道来,眼中闪烁着光,像是夏夜里的萤火。

  • pdf编辑器怎么样换章的颜色(爱福印给您科普)

    Adobe公司设计其的目的是为了支持跨平台出版和发布多媒体集成的信息。本文将介绍PDF文件在拼版输出前的处理方法,以帮助读者避免因PDF处理不当而对后续印刷工艺造成的质量事故。此时,AdobeAcrobat9Pro提示本操作不可恢复,是否要继续,点击“确定”,退出“拼合器预览”对话框。图13“拼合器预览”对话框通过以上合理的操作,PDF文件符合印前拼版输出要求,从而可避免后序印刷生产中可能出现的差错。

  • 魔域军团名字大全唯美(魔域军团名字大全唯美四个字)

    1、十二月风雪客2、醉梦轻拥你3、一首缠绵4、等你三年5、回顾过往6、最近好吗7、风之乐8、暖南倾绿9、懒风荡秋千10、清风与鹿11、清新少女贩卖机12、夏天吃了春天13、树瑶风14、相思落无声15、惟欲睡16、海棠才谢17、情字白头18、良辰未赏透19、对错何妨20、爱人不过是碍人21、匿名的关系22、抚你发端23、一语戳破

  • 做梦洗澡(做梦洗澡好不好)

    做梦洗澡男人梦见洗澡,表示身体健康,同时也暗示有射精的冲动,在心理分析中,被称为典型的“泄烘梦”。在年轻的男生中,这是个很常见的梦。怀孕的妇女梦见洗澡,提示梦者有意外的事件降临。寡妇梦见洗澡,表明想要淡忘前夫的愿望。已婚女人梦见在浴盆或浴房里洗澡,还暗示近期可能要怀孕。未婚女子做这样的梦,则表示可能会为性或婚事担心。梦见用热水淋浴,预示生活幸福,家庭美满,或有强烈的性欲。

  • mr增强与ct增强哪个副作用大(同一天做能行吗)

    为了便于疾病的精准诊断,临床医生常常会根据病情,建议患者做增强CT或增强MR(磁共振)检查,有的患者甚至同时需要做这两项检查。由此可见,对于肾功能异常患者,应尽量避免CT和MR增强在同一天检查。肾功能正常检查至少间隔四小时根据指南,肾功能正常或中度降低的患者给药4小时后,碘对比剂和细胞外钆对比剂的排泄率均可达到75%。因此打了碘对比剂后,它不影响增强MR的图像质量。

  • 违约金与赔偿损失能否同时主张(什么情况下可以)

    违约金与赔偿损失能否同时主张根据《合同法》和最高院关于审理买卖合同纠纷案件适用法律问题的解释相关条款的规定,违约金和损失赔偿不能同时主张。“过分高于造成的损失”,在最高院关于适用《合同法》若干问题的解释(二)第29条第二款作了解释:“当事人约定的违约金超过造成损失的百分之三十的,一般可以认定为合同法第一百一十四条第二款规定的‘过分高于造成的损失’”。

  • 春耕一般在什么节气(春耕一般在啥节气)

    跟着小编一起来看一看吧!立春过后,春耕即将开始,在中国一些地区一直传承着试犁的习俗。中国古代以农业立国,农业讲究时令气节,春耕、夏耘、秋收、冬藏,一概以时令为转移。时令的更换,一般民众只能凭借物候的变化来判定,有天文知识的巫师则能借助观测天象来确定。

  • 有什么好听的早安歌曲(起床号4月13日早安)

    小“火”伴们,大家好!今天是4月13日,农历三月十三,星期三。真正的成长是对这个世界越来越温柔。歌曲《最美的期待》送给大家。

  • 小米无线充电宝能达到10w吗(无论是小米笔记本还是任天堂Switch都能使用的充电宝)

    包装正面,紫米10号的品牌、型号、照片。上盖的内侧,贴有黑色海绵保护垫,减少充电宝在运输途中的震动,降低起火风险。▼还有一根50cm长度的Type-CtoType-C数据线▼紫米10号边缘圆滑,没有任何快口。▼ZM的Logo印在了充电宝的正面,在锖色的主体下,并不是很明显。▼紫米10号,在侧面有一个按钮,但这并不是电源开关,而是电源检测键,它有2个功能。为老妈买的小米Mix2,今晚才能送到。

  • 2023温州出台居家医疗服务价格和医保支付新政策

    家庭病床建床费、上门服务费项目适用于基层医疗卫生机构;上门服务费项目适用于县级及以上公立医疗机构及非营利性质的非公立医疗机构。