C++题目练习08
8.1 字符串类的实现 3
在《字符串类的实现 2》的基础上,增加 myString字符串类 的方法:
(指路 C++题目练习05 5.3)
-
重载运算符 << :先输出 len ,然后一个空格,一个冒号,再一个空格,然后输出 data 所指字符数组。如果不含字符,则只输出一个 0。
-
重载运算符 >> :读入字符串,存入 data 所指字符数组。注意:读入的一行字符串长度可能很大,建议先读入到一个 string 对象后再处理。
#include <iostream>
#include <cstring>
using namespace std;
class myString {
private:
char *data;
int len;
public:
myString() {
data = nullptr;
len = 0;
}
myString(char s[]) {
len = strlen(s);
data = new char[len + 1];
strcpy(data, s);
}
~myString() {
if (data != nullptr) {
delete[] data;
}
}
myString(const myString &b) {
len = b.len;
data = new char[len + 1];
strcpy(data, b.data);
}
int size() {
return len;
}
int set(char s[]) {
if (data != nullptr) {
delete[] data;
}
len = strlen(s);
data = new char[len + 1];
strcpy(data, s);
return len;
}
myString &operator=(const myString &b) {
if (this == &b) {
return *this;
}
else
{
if (data != nullptr) {
delete[] data;
}
len = b.len;
data = new char[len + 1];
strcpy(data, b.data);
}
return *this;
}
myString operator+(const myString &b) {
myString temp;
temp.len = len + b.len;
temp.data = new char[temp.len + 1];
strcpy(temp.data, data);
strcat(temp.data, b.data);
return temp;
}
myString sub( int start, int l ) {
myString ms;
ms.data = new char[l + 1];
ms.len = l;
for (int i = 0; i < l; i++)
ms.data[i] = '\0';
int j = 0;
for (int i = start - 1; (i < start + l - 1) && (i < len); i++, j++) {
ms.data[j] = data[i];
}
return ms;
}
void output()
{
if (len == 0)
cout << "0";
else
cout << len << " : " << data;
}
friend ostream &operator<<(ostream &out, const myString &s) {
if(s.len==0)
out<<"0";
else
out << s.len << " " << ": " << s.data;
return out;
}
friend istream &operator>>(istream &is, myString &s) {
string input;
getline(is,input);
s.len = input.length();
s.data = new char[s.len];
strcpy(s.data, input.c_str());
return is;
}
};
int main() {
myString a;
int n;
cin >> n;
// 以下2行没有本质作用,仅用于吸收换行符,就是 n 后面那个换行符
string tmp;
getline( cin, tmp );
for ( int i = 0; i < n; i++ ) {
cin >> a;
cout << a << endl;
}
return 0;
}
8.2 字符串类的实现 4
在《字符串类的实现 3》的基础上,增加 myString字符串类 的方法:
-
重载 小于比较运算符 < : a 和 b 两个字符串对象,从头到尾比较a和b的对应位置字符,当 a.data[i] < b.data[i] 时,表达式 a < b 为真
-
重载 大于比较运算符 > : a 和 b 两个字符串对象,从头到尾比较a和b的对应位置字符,当 a.data[i] > b.data[i] 时,表达式 a > b 为真
-
重载 不等于运算符 != : a 和 b 两个字符串对象,从头到尾比较a和b的对应位置字符,当 a.data[i] != b.data[i] 时,表达式 a != b 为真
-
重载 等于比较运算符 == : 当 a 和 b 含字符个数相同且对应位置的字符相等时,表达式 a == b 为真
#include <iostream>
#include <cstring>
using namespace std;
class myString {
private:
char *data;
int len;
public:
myString() {
data = nullptr;
len = 0;
}
myString(char s[]) {
len = strlen(s);
data = new char[len + 1];
strcpy(data, s);
}
~myString() {
if (data != nullptr) {
delete[] data;
}
}
myString(const myString &b) {
len = b.len;
data = new char[len + 1];
strcpy(data, b.data);
}
int size() {
return len;
}
int set(char s[]) {
if (data != nullptr) {
delete[] data;
}
len = strlen(s);
data = new char[len + 1];
strcpy(data, s);
return len;
}
myString &operator=(const myString &b) {
if (this == &b) {
return *this;
}
else
{
if (data != nullptr) {
delete[] data;
}
len = b.len;
data = new char[len + 1];
strcpy(data, b.data);
}
return *this;
}
myString operator+(const myString &b) {
myString temp;
temp.len = len + b.len;
temp.data = new char[temp.len + 1];
strcpy(temp.data, data);
strcat(temp.data, b.data);
return temp;
}
myString sub( int start, int l ) {
myString ms;
ms.data = new char[l + 1];
ms.len = l;
for (int i = 0; i < l; i++)
ms.data[i] = '\0';
int j = 0;
for (int i = start - 1; (i < start + l - 1) && (i < len); i++, j++) {
ms.data[j] = data[i];
}
return ms;
}
void output()
{
if (len == 0)
cout << "0";
else
cout << len << " : " << data;
}
friend ostream &operator<<(ostream &out, const myString &s) {
if(s.len==0)
out<<"0";
else
out << s.len << " " << ": " << s.data;
return out;
}
friend istream &operator>>(istream &is, myString &s) {
string input;
getline(is,input);
s.len = input.length();
s.data = new char[s.len];
strcpy(s.data, input.c_str());
return is;
}
bool operator<( myString &b)
{
int min;
if (len < b.len)
min = len;
else
min = b.len;
for (int i = 0; i < min; i++) {
if (data[i] < b.data[i]) {
return true;
}
else if (data[i] > b.data[i]) {
return false;
}
}
return len < b.len;
}
bool operator>(myString &b) {
int min;
if (len < b.len)
min = len;
else
min = b.len;
for (int i = 0; i < min; i++) {
if (data[i] > b.data[i]) {
return true;
}
else if (data[i] < b.data[i]) {
return false;
}
}
return len > b.len;
}
bool operator!=(myString &b) {
return !(*this == b);
}
bool operator==(myString &b) {
if (len != b.len) {
return false;
}
for (int i = 0; i < len; i++) {
if (data[i] != b.data[i]) {
return false;
}
}
return true;
}
};
int main() {
myString a, b;
cin >> a;
cin >> b;
if ( a == b ) {
cout << "a == b" << endl;
}
else {
if ( a > b ) {
cout << "a > b" << endl;
}
else {
if ( a < b ) {
cout << "a < b" << endl;
}
}
}
return 0;
}
8.3 字符串类的实现 5
在上一题基础上,增加 myString字符串类 的方法:
-
重载 下标运算符[] : operator [] ( int i ) ,要求作为左操作数,即把一个字符写入数据成员 data[i] 中
-
重载 下标运算符[] : operator [] ( int i ) ,要求作为右操作数,只读,即读取数据成员 data[i] 的值
-
重载 MyString类 到 char * 类型的转换 :operator char * () ,这个的目的是给下面的 read() 函数用的
#include <iostream>
#include <cstring>
using namespace std;
class myString {
private:
char *data;
int len;
public:
myString()
{
data = nullptr;
len = 0;
}
myString(char s[])
{
len = strlen(s);
data = new char[len + 1];
strcpy(data, s);
}
~myString() {
if (data != nullptr)
{
delete[] data;
}
}
myString(const myString &b)
{
len = b.len;
data = new char[len + 1];
strcpy(data, b.data);
}
int size()
{
return len;
}
int set(char s[])
{
if (data != nullptr)
{
delete[] data;
}
len = strlen(s);
data = new char[len + 1];
strcpy(data, s);
return len;
}
myString &operator=(const myString &b)
{
if (this == &b)
{
return *this;
}
else
{
if (data != nullptr)
{
delete[] data;
}
len = b.len;
data = new char[len + 1];
strcpy(data, b.data);
}
return *this;
}
myString operator+(const myString &b) {
myString temp;
temp.len = len + b.len;
temp.data = new char[temp.len + 1];
strcpy(temp.data, data);
strcat(temp.data, b.data);
return temp;
}
myString sub( int start, int l ) {
myString ms;
ms.data = new char[l + 1];
ms.len = l;
for (int i = 0; i < l; i++)
ms.data[i] = '\0';
int j = 0;
for (int i = start - 1; (i < start + l - 1) && (i < len); i++, j++) {
ms.data[j] = data[i];
}
return ms;
}
void output()
{
if (len == 0)
cout << "0";
else
cout << len << " : " << data;
}
friend ostream &operator<<(ostream &out, const myString &s) {
if(s.len==0)
out<<"0";
else
out << s.len << " " << ": " << s.data;
return out;
}
friend istream &operator>>(istream &is, myString &s) {
string input;
getline(is,input);
s.len = input.length();
s.data = new char[s.len];
strcpy(s.data, input.c_str());
return is;
}
bool operator<( myString &b)
{
int min;
if (len < b.len)
min = len;
else
min = b.len;
for (int i = 0; i < min; i++) {
if (data[i] < b.data[i]) {
return true;
}
else if (data[i] > b.data[i]) {
return false;
}
}
return len < b.len;
}
bool operator>(myString &b) {
int min;
if (len < b.len)
min = len;
else
min = b.len;
for (int i = 0; i < min; i++) {
if (data[i] > b.data[i]) {
return true;
}
else if (data[i] < b.data[i]) {
return false;
}
}
return len > b.len;
}
bool operator!=(myString &b) {
return !(*this == b);
}
bool operator==(myString &b) {
if (len != b.len) {
return false;
}
for (int i = 0; i < len; i++) {
if (data[i] != b.data[i])
{
return false;
}
}
return true;
}
char &operator[](int i) {
return data[i];
}
const char &operator[](int i) const {
return data[i];
}
operator char*() {
return data;
}
};
void read( char *p, int n ) {
for ( int i = 0; i < n; i++ )
cin >> p[i];
}
int main() {
myString a;
cin >> a; /// 验证 流提取运算符的重载
cout << a << endl; /// 验证 流插入运算符的重载
for ( int i = 0; i < a.size(); i ++ )
cin >> a[i]; /// 验证下标运算符的重载
string tmp;
cin >> tmp; /// 吸收掉上一行剩余的内容,不至影响到下面的 read()
for ( int i = 0; i < a.size(); i ++ )
cout << a[i];
cout << endl;
read( a, 20 ); /// 验证 类型转换的重载
cout << a << endl;
return 0;
}