描述
在《字符串类的实现 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;
}