char *s1 与 char s2[]的区别

今天看到如下代码

char str1[]       = "abc";
char str2[]       = "abc";
const char str3[] = "abc"; 
const char str4[] = "abc"; 
const char* str5  = "abc";
const char* str6  = "abc";
cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?
cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?
cout << boolalpha << ( str5==str6 ) << endl; // 输出什么?

动手试了下,发现结果是:

false
false
true

前两个false不难理解,调试时发现str5 与 str6 的地址是一样的。去网上搜了搜,发现原来

如果同一文件中char *s1与 char *s2 的值是一样的,那么系统会自动优化,将它们存在相同内存,

即s1 与 s2 的值会相等,但如果用来比较两字符串是否相等,还是用 strcmp 比较好。


注:本题需使用自定义String类完成代码补全 ```c++ #include <iostream> #include <cstring> using namespace std; class String{ private: char* str; // 字符串的指针 int len; // 字符串的长度 public: // 构造函数 String(){ len = 0; str = new char[1]; str[0] = '\0'; } // 析构函数 ~String(){ delete [] str; } // 拷贝构造函数 String(const String& s){ len = s.len; str = new char[len+1]; strcpy(str, s.str); } // 赋值运算符重载函数 String& operator=(const String& s){ if(this != &s){ delete [] str; len = s.len; str = new char[len+1]; strcpy(str, s.str); } return *this; } // 加法运算符重载函数 String operator+(const String& s){ String tmp; tmp.len = len + s.len; tmp.str = new char[tmp.len+1]; strcpy(tmp.str, str); strcat(tmp.str, s.str); return tmp; } // 加等于运算符重载函数 String& operator+=(const String& s){ len += s.len; char* tmp = new char[len+1]; strcpy(tmp, str); strcat(tmp, s.str); delete [] str; str = tmp; return *this; } // 小于运算符重载函数 bool operator<(const String& s){ if(strcmp(str, s.str) < 0){ return true; } return false; } // 下标运算符重载函数 char& operator[](const int index){ return str[index]; } // 取长度函数 int length(){ return len; } // 取字符串指针函数 char* c_str(){ return str; } }; int main() { String str1, str2; // 初始化定义str1,str2,city String city = "Beijing"; cout << "输入str1和str2字符串:" << endl; cin >> str1 >> str2; cout << "输出str1和str2字符串:" << endl << str1.c_str() << "," << str2.c_str() << endl; str1 = city; // 调用=运算符重载函数,将city对象的值赋给str1对象 cout << "重新输出str1和str2字符串:" << endl << str1.c_str() << "," << str2.c_str() << endl; String s1 = "123"; // 初始化定义s1s2 String s2 = "abc"; cout << s1.c_str() << endl; String s3; s3 = s1 + s2; // 调用+运算符重载,将s1s2的字符串连接赋给s3 cout << s3.c_str() << endl; s3 += "de"; // 调用+=运算符重载,将字符串"de"追加到s3后面 cout << s3.c_str() << endl; bool b = s1 < s3; // 判断字符串s1是否小于s3 cout << "s1<s3=" << b << endl; char ch = s1[2]; cout << "字符串s1的第三个字符为:" << ch << endl; s1[2] = '5'; // 将字符串s1的第三个字符改成5 cout << "重新输出s1为: " << s1.c_str() << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值