#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
//string定义在命名空间std中
int main()
{
/**************3.2.1 定义和初始化string*****************/
string s1; //默认初始化,S1是一个空字符串
string S2 = s1; //S2时S1的副本
string s3 = "hello lijun"; //S3是字面值hello lijun的副本
/*注意:
1,什么叫string?
可变长的字符序列
2,什么叫字面值?
3,字符串字面值结尾的空字符不会被赋给字符串
空字符是字符串的终止符尔不是字符序列的终止符
*/
/*直接初始化和拷贝初始化
当初始值只有一个时使用直接初始化或拷贝初始化都是可以的
多值初始化做好用拷贝初始化*/
string s4(10, 'a'); //s4的内容是10和c
//string s4(1,"hello lijun"); //错误
string s5(s4); //s4是s1的副本,与9 line类似
string s6("hello lijun"); //s3是字面值“hello lijun"的副本
//string s6(hello lijun); 错误
string s7 = string (10, 'a'); //显示的创建一个临时对象用于拷贝
/*
其效果等价于:string temp (10, 'a')
string s7 = temp;
*/
/*******************3.2.2 string对象上的操作**************/
//一个类除了要定义初始化方式外还需要定义对象上所能执行的操作。
//-------1读写操作-----------
string s;
cin >> s;
cout << s << endl;
//在执行读取操作时,string会自动忽略开头的空白(空格,换行,制表等)
//并从第一个真正的字符开始读起,知道遇见下一个空白为止。
//返回左侧的运算符作为运算结果
//-------2读取未知数量的string对象-----------
string word;
while ((cin >> word) && (word != "END"))//自动以END作为结束标志符
cout << word << endl;
//注意字符串中含有空格时的输出
//-------3使用getline 读取一整行-----------
//-------empty和size的用法-----------
//s.empty()根据string对象是否为空返回一个对应的bool变量
//s.zize()函数返回string的长度
//其实s.zize()返回的是string::size_type类型,这是一种新的类型
//string类及其它大多数标准库类型都定义了几种配套的类型
//这些配套类型体现了标准库类型的机器无关性
//所有用于存放string类的size函数返回值的变量都应该用string::size_type类型
//s.zize()返回的是unsigned类型的值,不可用int混用
string line;
while (getline(cin, line, '#'))//注意结束标志位
{
if (!line.empty()) //只输出非空行
{
cout << line << endl;
}
auto len = line.size();
cout << len;
}
return 0;
}