标准库类型string
string表示可变长的字符序列,使用string类型必须包含string头文件。作为标准库的一部分,string定义在命名空间std中。接下来的示例中都认为包含了下述代码:
#include <string>
using std::string;
初始化string对象的方式:
string s1; //默认初始化s1为空串
string s2 = s1; //s2是s1的副本
//等价于string s2(s1);
string s3 = "hello"; //s3是字面值"hello"的副本(不包含空字符'\0')
//等价于string s3("hello");
string s4(10, 'c'); //将s4初始化为10个字符c组成的字符串
string对象上的一些操作(详细介绍在后面):
os << s 将s写到输出流os中,返回os
is >> s 从输入流is中读取字符串赋给s,返回is
getline(is, s) 从输入流is中读取一行赋给s,返回is
s.empty() s为空返回true,否则返回false
s.size() 返回s中字符的个数
s[n] 返回s中第n个字符的引用,n从0计起
s1 + s2 返回s1和s2连接后的结果
s1 = s2 用s2的副本代替s1中原来的字符
s1 == s2 s1和s2完全一样,则相等,对大小写敏感
s1 != s2
<, <=, >, >= 利用字符在字典中的顺序进行比较
读写string对象
在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等)并从第一个真正的字符开始读起,到遇到下一处空白为止。
int main(){
string s;
cin >> s;
cout << s << endl;
return 0;
}
使用getline可以读取一整行,包括其中的空白符,直到遇到换行符为止。
int main(){
string s;
while(getline(cin, s)) //每次读入一整行,直到到达文件末尾
cout << s << endl; //s中不含换行符,手动加上换行操作符
return 0;
}
string::size_type类型
size函数的返回值类型并非int或unsigned,而是在类string中定义的string::size_type类型。此类型是一个无符号类型的值并且能够存放下任何string对象的值。
auto len = s.size(); //len的类型是string::size_type
如果一条表达式中已经有了size()函数就不要再使用int了,这样可以避免混用int和unsigned可能带来的问题。如表达式s.size() < -10的判断结果几乎肯定是true,因为将负值转换成无符号值会是一个比较大的值。
string对象的加法
两个string对象相加会得到一个新的string对象,其内容是将左侧的对象与右侧的对象连接而成。
C++中字符串字面值与标准库类型string是不同的类型。当把string对象和字符字面值和字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string。
string s1 = "hello", s2 = "world";
string s3 = s1 +","; //正确:把一个string对象和一个字面值相加
string s4 = "hello" + ","; //错误:两个运算对象都不是string类型
string s5 = s1 + "," + "world"; //正确:相当于(s1 + ",") + "world"两次运算都是正确的
string s6 = "hello" + "," + s2; //错误:先进行"hello" + ","两个运算对象都不是string类型
比较两个string类型规则
1、如果两个string长度不同,且较短string对象的每个字符都与较长string对象对应位置上的字符相同,就是较短string < 较长string
2、如果两个string在某些对应位置的字符不同,则比较结果就是第一对相异字符按字典顺序比较的结果
string a = "Hello";
string b = "Hello World"
string c = "Hiya";
根据规则1,b > a;根据规则2,c > b。
cctype头文件
在cctype头文件中定义了一组标准库函数来方便改变某个字符的特性。(下面仅列举了一些个人认为较常用的)
isalnum(c) 当c是字母或数字时返回true
isalpha(c) 当c是字母时返回true
isdigit(c) 当c是数字时返回true
isspace(c) 当c是空白(空格、横向制表符、纵向制表符、回车符、换行符、进纸符)时返回true
islower(c) 当c是小写字母时返回true
isupper(c) 当c是大写字母时返回true
tolower(c) 如果c是大写字母,输出对应的小写字母,否则原样输出c
toupper(c) 如果c是小写字母,输出对应的大写字母,否则原样输出c
注:如cctype这个头文件,在C语言的头文件中是ctype.h,C++中兼容了C语言标准库,去掉了.h后缀,在文件名ctype前加了字母c,这里的c表示这是一个属于C语言标准库的头文件。c**和**.h头文件的内容是一样的,但命名规范上c**更符合C++的标准。
基于范围的for语句
for (declaration:expression)
statement
decaration部分负责定义一个被用于访问序列中基础元素的变量,expression部分是一个表示被访问序列的对象,statement是循环体
string s("Hello World!");
int alpha_cnt = 0;
for (auto c : s)
if (isalpha(c))
++alpha_cnt;
cout << alpha_cnt << " punctuation characters in " << s <<endl;
程序输出结果是:
10 punctuation characters in Hello World!