c++字符串比较大小规则(c++字符串比较函数)
admin
2023-09-09 14:26:05
0

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 #include using namespace std;int main(void){ const char *passwd = "ap_passwd"; string str = "ap_passwd"; cout<<"passwd="<

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())

以上就是c++字符串比较大小规则(c++字符串比较函数)的相关内容了,更多精彩请关注我们!!

相关内容

热门资讯

现实版《三体》红岸基地,中国深... 这里是现实版《三体》红岸基地,中国深空“最强瞭望台”聆听40亿公里外信号。66米口径亚洲最大天线藏于...
中国海警舰艇编队5月7日在我钓... 5月7日,中国海警1306舰艇编队在我钓鱼岛领海内巡航。这是中国海警依法开展的维权巡航活动。
受贿1.34亿余元 安徽省政协... 2026年5月7日,福建省漳州市中级人民法院公开宣判安徽省政协原党组成员、副主席周喜安受贿一案,以受...
中东媒体称美伊已就缓解美国海上... 据中东媒体7日援引消息人士的话报道,伊朗和美国已就缓解美国海上封锁以换取霍尔木兹海峡逐步重新开放达成...
荷航一空乘人员疑似感染汉坦病毒... 荷兰卫生部5月7日表示,一名荷兰女子因出现汉坦病毒感染的疑似症状,已被送往阿姆斯特丹的一家医院接受治...
外交部:中方赞赏法方推动流失文... 5月7日,外交部发言人林剑主持例行记者会。有记者问,法国国民议会以141票赞成、0票反对的投票结果,...
“洪迪厄斯”号邮轮涉汉坦病毒病... “洪迪厄斯”邮轮当地时间6日,英国卫生安全局发布声明表示,两名曾搭乘“洪迪厄斯”邮轮的英国乘客已返回...
外交部:敦促日本执政当局正视问... 5月7日,外交部发言人林剑主持例行记者会。有记者问,距日本首相高市早苗去年11月7日在国会发表的涉台...
新疆维吾尔自治区政协原党组成员... 经中共中央批准,中央纪委国家监委对新疆维吾尔自治区政协原党组成员、副主席金之镇严重违纪违法问题进行了...
第三轮第六批中央生态环境保护督... 为深入贯彻党的二十大和二十届历次全会精神,认真落实四中全会部署,贯彻落实习近平生态文明思想和习近平总...
英国计划接回涉疫邮轮上的本国公... △“洪迪厄斯”邮轮当地时间6日,英国卫生安全局发布声明表示,两名曾搭乘“洪迪厄斯”邮轮的英国乘客已返...
韩前总理韩德洙“从事内乱重要任... △韩国前国务总理韩德洙(资料图)当地时间7日上午,韩国首尔高等法院就前总理韩德洙涉嫌在尹锡悦发动紧急...
美法官公布一份“爱泼斯坦遗书” 美国一名联邦地区法院法官6日公开一张纸条,据称是臭名昭著的已故美国富商爱泼斯坦所写遗书。其中一句话写...
距离达成停战协议还有多远?美称... 近日,美方持续释放关于结束伊朗战事的信号。美国总统特朗普6日数次表示,对美国同伊朗达成协议表示乐观,...
消息人士称伊朗预计将于7日回应... △伊朗首都德黑兰(资料图)当地时间5月6日,据一位地区消息人士表示,伊朗预计将于5月7日向调解人提交...
美对伊战事或为白宫记协晚宴枪手... 当地时间5月6日,总台记者获悉,美国国土安全部在一份情报评估中指出,美国对伊朗发起的军事行动可能是白...
以总理称以军袭击贝鲁特 黎真主... △以色列方面发布的图片当地时间6日,以色列总理内塔尼亚胡和以国防部长卡茨发表联合声明称,以军在黎巴嫩...
矿床地质学家、中国工程院院士陈... 据中国工程院官网发布的信息,矿床地质学家、中国工程院院士陈毓川,于2026年5月6日逝世。陈毓川,1...
中国驻以色列使馆发言人就以色列... 记者:近日,以色列未来党议员托波洛夫斯基再次窜访台湾。请问你对此有何评论?使馆发言人:以色列未来党议...
国乒男团3比1罗马尼亚 晋级世... 北京时间5月6日,2026伦敦世乒赛男团1/8决赛,国乒男团以总比分3-1战胜罗马尼亚队,晋级8强。...