字符串类的实现

描述

在《字符串类的实现 2》的基础上,增加 myString字符串类 的方法:

  • 重载运算符 << :先输出 len ,然后一个空格,一个冒号,再一个空格,然后输出 data 所指字符数组。如果不含字符,则只输出一个 0。

  • 重载运算符 >> :读入字符串,存入 data 所指字符数组。注意:读入的一行字符串长度可能很大,建议先读入到一个 string 对象后再处理。

#include <iostream>
using namespace std;

你写的代码放在这里,包括类的定义和成员函数实现

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;
}

输入描述

第一行是一个正整数 n,接下来 n 行,每行一个字符串,字符串中不含空格。

注意:可能含有空行,即长度为 0 的空字符串。

输出描述

输出 n 行,每行一个 myString对象

解读题目要求

1.重载运算符 << :先输出 len ,然后一个空格,一个冒号,再一个空格,然后输出 data 所指字符数组。如果不含字符,则只输出一个 0。

注意:换行就是不含字符,空格是字符,一个空格算一个字符

ostream& operator<<(ostream& out, myString& t)
{
    t.len = strlen(t.a);
    if (t.len == 0)//输入空行
    {
        cout << "0";
        return out;
    }
    else
    {
        out << t.len << " : " << t.a;
    }
    return out;
}

2.重载运算符 >> :读入字符串,存入 data 所指字符数组。注意:读入的一行字符串长度可能很大,建议先读入到一个 string 对象后再处理。

不能直接输入字符串,要按题目要求来,先读入一个string对象后再处理

istream& operator>>(istream& in, myString& t)
{
    string input;
    getline(in, input); // 读入一行字符串到input中
    strcpy(t.a, input.c_str()); // 将input中的内容复制到t.a中
    return in;
}

getline()函数

istream& getline (istream& is, string& str, char delim);

其中,is是输入流对象,str是存储读取内容的字符串对象,delim是可选参数,表示行结束符(默认为换行符'\n')。

功能:此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。遇到换行符或者EOF结束,不读取换行符delim是自己设定的结束符

input(char)与t.a(const char*)类型不同,使用strcpy会报错,所以使用c_str()函数

c_str() 函数

头文件:#include<cstring>

功能:c_str() 函数可以const string* 类型 转化为 const char* 类型

c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址

完整代码 

#include <iostream>
#include<string>
#include <cstring>
using namespace std;

class myString
{
public:
    myString()
    {
        len = 0;
        a = new char[50];
    }
    ~myString()
    {
        delete[] a;
    }
    friend ostream& operator<<(ostream& out, myString& t);
    friend istream& operator>>(istream& in, myString& t);
private:
    char* a;
    int len;
};

ostream& operator<<(ostream& out, myString& t)
{
    t.len = strlen(t.a);
    if (t.len == 0)//输入空行
    {
        cout << "0";
        return out;
    }
    else
    {
        out << t.len << " : " << t.a;
    }
    return out;
}

istream& operator>>(istream& in, myString& t)
{
    string input;
    getline(in, input); // 读入一行字符串到input中
    strcpy(t.a, input.c_str()); // 将input中的内容复制到t.a中
    return in;
}

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;
}

自己实现字符串 class CMStringImp; class CMstring { public: explicit CMstring(void); ~CMstring(void); CMstring(LPCTSTR lpszstr); CMstring(const CMstring& lpszstr); CMstring& operator = (const CMstring& lpszstr); operator LPCTSTR() const; bool operator == (const CMstring&) const; bool operator != (const CMstring&) const; bool operator < (const CMstring&) const; TCHAR operator[] (int nIndex) const; TCHAR& operator[] (int nIndex); CMstring& operator += (LPCTSTR pStr); CMstring& operator += (TCHAR ch); friend CMstring operator+(const CMstring& str1, const CMstring& str2); friend CMstring operator+(const CMstring& str1, LPCTSTR lpszstr); friend CMstring operator+(const CMstring& str1, TCHAR ch); friend CMstring operator+(TCHAR ch, const CMstring& str1); friend CMstring operator+(LPCTSTR lpszstr, const CMstring& str1); // friend wostream operator <<(wostream &is;,const CMstring &str;); public: LPCTSTR GetData() const; bool IsEmpty() const; TCHAR GetAt(int) const; TCHAR& GetAt(int); int GetLength() const; int Compare(const CMstring&) const; int CompareNoCase(const CMstring&) const; int Find(TCHAR ch, int nStart = 0) const; int Find(LPCTSTR pStr, int nStart = 0) const; int ReverseFind(TCHAR ch) const; int ReverseFind(LPCTSTR pStr) const; CMstring Right(int nCount) const; CMstring Left(int nCount ) const; public: CMstring& MakeLower(); CMstring& MakeUpper(); CMstring& MakeReverse(); int Replace(TCHAR chOld, TCHAR chNew); int Replace(LPCTSTR pszOld, LPCTSTR pszNew); int Insert(int iIndex, TCHAR ch); void Format(LPCTSTR lpszFormat, ...); private: CMStringImp* m_pImp; };
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值