C++ Primer笔记(3.2.2 )—— string对象上的操作
#include<iostream>
#include<string>
/***********************************************************************************/
/* string的操作 */
/* */
/* os<<s ------ 将s写到输出流os当中,返回os */
/* is>>s ------ 从is中读取字符串赋给s, 字符串以空白分割,*/
/* 返回is */
/* getline(is, s) ------ 从is中读取一行赋给s,返回is */
/* s.empyt() ------ s为空返回true,否则为false */
/* s.size() ------ 返回s中字符的个数 */
/* s[n] ------ 返回s中第n个字符的引用 */
/* s1 + s2 ------ 返回s1和s2连接后的结果 */
/* s1 = s2 ------ 用s2的副本代替s1中原来的字符 */
/* s1 == s2 ------ 如果s1和s2中所含的字符完全一样,则相等; */
/* s1 != s2 ------ */
/* <, <=, >, >= ------ 利用字符在字典中的顺序进行比较,对大小写 */
/* 敏感 */
/***********************************************************************************/
using std::string;
int main()
{
/* ----- 读写string对象 ----- */
string s; //空字符串
std::cin >> s; //将string对象读入s,遇到空白停止
std::cout << s << std::endl;
//在读取操作时,string对象会自动忽略开头的空白(空格,换行等)并从第一个真正的字符开始读起,直到遇见下一处空白为止
//如上,输入的是" Hello World "(注意开头和结尾处的空格),则输出的是"Hello",输出结果中没有任何空格
std::cout << std::endl;
//和内置类型的输入输出操作一样,string对象的此类操作也是返回运算符左侧的运算对象作为其结果。
//因此,多个输入或者多个输出可以连写在一起
string s1, s2;
std::cin >> s1 >> s2;
std::cout << s1 << s2 << std::endl;
//假设给上面这段程序输入与之前一样的内容" Hello World! ",
//输出将是"HelloWorld!"
std::cout << std::endl;
/* -------------------------- */
/* ----- 使用getline读取一整行 ----- */
//getline()函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,
//直到遇到换行符为止(换行符也会读进去),然后把所读的内容存入到那个string对象
//中去(注意不存换行符号)
string line;
while (getline(std::cin, line))
std::cout << line << std::endl;
//因为line中不包含换行符,所以我们手动地加上换行符。
std::cout << std::endl;
/* --------------------------------- */
/* ----- string的empty和size操作 ----- */
//empty函数根据string对象是否为空,返回一个对应的bool值
//每次读入一整行,遇到空行直接跳过
string line2;
while (getline(std::cin, line2))
if (!line2.empty())
std::cout << line2 << std::endl;
std::cout << std::endl;
//size函数返回string对象的长度(即string对象中字符的个数)
string line3;
//每次读入一整行,输出其中超过10个字符的行
while (getline(std::cin, line3))
if (line3.size() > 10)
std::cout << line3 << std::endl;
std::cout << std::endl;
/* ----------------------------------- */
/* ----- string::size_type类型 ----- */
//对于size()函数来说,size()返回的是一个string::size_type类型的值,下面对其进行解释:
//string::szie_type是一个无符号类型的值,而且能足够存放下任何string对象的大小。
//所有用于存放string类的size函数返回值的变量,都应该是string::size_type类型的。
auto len = line.size(); //len的类型是string::size_type类型
//由于size函数返回的是一个无符号整型数,因此切记,如果在表达式中混用了带符号数和无符号数将可能产生意想不到的结果
//如果一条表达式中已经有了size()函数就不要再使用int,这样可以避免混用int和unsigned可能带来的问题
/* --------------------------------- */
/* ----- 比较string对象 ----- */
//相等性运算符(==和!=)分别检验两个string对象相等或不相等,string对象相等意味着它们的长度相同而且所包含的字符也全都相等
//关系运算符<、<=、>、>=分别检验一个string对象是否小于、小于或等于、大于、大于或等于另外一个string对象。
//上述这些运算符都依照(大小写敏感的)字典顺序:
// 1.如果两个string对象的长度不同,而且较短string对象的每个字符都与较长string对象对应位置上的字符相同,
// 就说较短的string对象小于较长的string对象。
// 2.如果两个string对象在某些对应的位置上不一致,则string对象比较的结果其实是string对象中第一对相异字符比较的结果。
string str = "Hello";
string phrase = "Hello World";
string slang = "Hiya";
//根据规则1可判断,对象str小于对象phrase;
//根据规则2可判断,对象slang即大于str也大于phrase
/* -------------------------- */
/* ----- 两个string对象相加 ----- */
string s1 = "hello", s2 = "world\n";
string s3 = s1 + s2;
s1 += s2;
std::cout << "s3的值为:" << s3 << std::endl;
std::cout << "s1的值为:" << s1 << std::endl;
std::cout << std::endl;
/* ------------------------------ */
/* ----- 字面值和string对象相加 ----- */
//标准库允许把字符字面值和字符串字面值转换成string对象,所以在需要string对象的地方就可以使用这两种字面值来代替
string str1 = "hello", str2 = "world";
string str3 = str1 + ", " + str2 + '\n';
std::cout << "str3的值为:" << str3 << std::endl;
//当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)
//的两侧的运算对象至少有一个是string
string str4 = str1 + ",";
//string str5 = "hello" + ","; //错误:两个运算对象都不是string
//string str6 = "hello" + "," + str1; //错误
string str7 = (s1 + ",") + "world"; //正确
/* ---------------------------------- */
return 0;
}