判断字符串相等
来源:互联网 发布:美国制造业数据 编辑:程序博客网 时间:2024/05/29 12:33
笔试题:
下面这段代码输出是什么:
#include <iostream> using namespace std;int main(){char *str1 = "abc";char *str2 = "abc";char str3[] = "abc";char str4[] = "abc";string str5 = "abc";string str6 = "abc";cout<<(str1 == str2)<<endl;cout<<(str3 == str4)<<endl;cout<<(str5 == str6)<<endl;return 0;}
输出结果:
1
0
1
疑问:
第三个都是string,直接用==判断相等完全没问题,所以输出1,但是第一种和第二种情况输出结果不同怎么解释?
下面这份代码或许就能解释了:
#include <iostream> #include <cstring>//support for strcmp(),也可写成#include "string.h" using namespace std;int main(){const char *str1 = "abc";const char *str2 = "abc";char str3[4] = "abc";//{'a','b','c'};char str4[4] = "abc";//{'a','b','c'};string str5 = "abc";string str6 = "abc";cout<<&str3<<" " <<&str4<<endl;cout<<&"abc"<<" " <<&"abc"<<" "<<&"abc"<<endl;cout<<"str1 == str2: "<<(str1 == str2)<<endl;cout<<"*str1 == *str2: "<<(*str1 == *str2)<<endl;cout<<"str3 == str4: "<<(str3 == str4)<<endl;cout<<"str3 > str4: "<<(str3 > str4)<<endl;cout<<"strcmp(str3,str4): "<<strcmp(str3,str4)<<endl;//char数组标准的判断相等函数 cout<<"str5 == str6: "<<(str5 == str6)<<endl;/**输出:0x28fe92 0x28fe8e0x47f000 0x47f000 0x47f000str1 == str2: 1*str1 == *str2: 1str3 == str4: 0str3 > str4: 1strcmp(str3,str4): 0str5 == str6: 1*/return 0;}/**strcmp()函数解析: 头文件:#include <string.h>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 的值。*/
(1)str1和str2是char*,也就是一个指针,然后它们都来自于"abc"的赋值,通过直接输出"abc"的地址可以发现都是相等的,因为它是一个const string,存放在全局数据区当中,对str1和str2的初始化,C++只会建立一个"abc" const string,从而str1和str2这两个指针指向的是同一块内存,也就是说str1和str2的值(是那块同样的内存的地址值)是相等的,于是str1 == str2就解释得通了。
(2)*str1 == *str2因为取的是同一块内存里面的东西,自然也是相等。
(3)再看char[]数组,无论是
char str3[] = "abc";还是
char str3[] = {'a','b','c'};其过程都是将元素逐一复制到str3数组当中,它并不存在指针指向一个const string一说,并且str3表示的是数组的首地址,同理str4.直接拿str3 == str4来作比较,也即拿这两个char数组的首地址的值来比较,自然是不相等的,str3数组的首地址比str4的首地址要大,也就是str3 > str4返回的是1(true),所以注意这里是拿它们的地址来作比较。
所以str1 == str2 与 str3 == str4:一个是常量字符串(位于内存四区中的数据区中的常量区)的指针(地址)比较,一个是数组(栈内存)地址比较。
关于C/C++语言的内存四区模型理解:参考下面的博客:
C语言之内存四区模型和函数调用模型
(4)来到strcmp函数,这个函数是用来比较两个char *字符串的大小,如果两个字符串相等则返回0,前面的比后面的大则返回1,反之则返回-1,所以用这个函数才能判断出str3和str4代表的字符串是相等的,前面的只是拿地址来比较,而不是内容的比较。因为在C语言中,char数组(C风格字符串)并不支持直接使用==来判断字符串相等,需要调用函数才能达到目的。
(5)至于string,跟(1)差不多的原理,而且C++的string本来就支持直接使用“==”来比较两个字符串是否相等(运算符重载的支持)。
0 0
- Java判断字符串相等
- java判断字符串相等
- jquery字符串相等判断
- java判断字符串相等
- 判断字符串相等
- 字符串相等判断
- js 字符串相等判断
- java字符串判断相等
- 字符串相等判断
- 判断字符串是否相等
- 判断字符串相等
- java判断字符串相等
- 判断字符串是否相等
- java判断字符串相等
- JS判断字符串是否相等
- 如何判断两个字符串相等
- matlab 判断字符串相等与否
- JS判断字符串是否相等
- android studio 简单配置
- mina源码阅读之过滤器
- 【Java Web】——配置文件的格式之xml和properties的区分
- 1-1.什么是Hadoop(Hadoop系列day01)
- HTTP/2 与 WEB 性能优化(二)
- 判断字符串相等
- Hadoop回顾--Hive特性(一)
- 82. Remove Duplicates from Sorted List II(python)
- HTTP/2 与 WEB 性能优化(一)
- Service与Activity之间的通信(同一进程)binder
- hibernate crud的两种方案对象和sql ---- session和sql与数据库交互
- 《数据结构与算法》学习笔记27 堆排序
- struts2中后台向JSP传值
- qsort