与其它标准库一样,使用string类型对象,必须包含相关头文件。如果提供了合适的using声明,则编出来的程序相对简洁些:
#include<string>
using std::string;
(一)string的初始化的几种形式:
string s1; // 默认构造函数,s1为空串
string s2(s1); //将s2初始化为s1的一个副本
string s3("value"); //将s3初始化为一个字符串字面值的副本
string s4(n,'c'); //将s4初始化为一个字符的n个副本
(二)string的读写:
第一种形式的读入——直接读入:
string str;
cin>>str;
第二种形式的读入——利用getline()函数整行读入:
string str;
getline(cin,str);
需要注意的是:getline()并不忽略开头的换行符,只要getline遇到换行符,即使它输入的是第一个字符,getline()也将停止读入并返回,如果第一个字符就是换行符,则读入的字符串为空字符。
(三)string对象的常用操作:
string s,s1,s2;
string::size_type n;
s.empty() //如果s为空串,则返回true,否则返回false
s.size() //返回s字符的个数
s[n] //返回s中第n个字符
s1+s2 //将s1和s2连接起来组成一个新字符
s1=s2 //把s1内容替换为s2的副本
s1==s2 //若s1和s2内容完全相同,则返回true,否则返回false
s1+=s2 //将s2的内容添加到s1的后面
1. if(st.size==0) 和 if(st.empty()) 效果等同。
2.string::size_type 为一个unsigned类型的整数值,它可以保证足够大的能够保证任意string类型的长度。 特别注意:任何存储string的size返回值为string::size_type类型的值,特别重要的是:不要把size的返回值赋给一个int变量。
3. 和字符串字面值的连接是允许的,如:
string s1("hello");
s1=s1+"abc";
但要注意,+号的左右操作数必须有一个是string类型的!
string s1("hello");
s1="abc"+"c"; //error!
string s2="world";
s1=s1+"abc"+s2+"c"; //right
(四)string对象中字符的处理
我们经常需要对string中的单个字符进行处理,现有一系列常用字符操作函数,适用于string对象的字符,这些函数都在cctype头文件中定义。
isalnum(c) 判断c是否为字母或数字,是则返回true;
isalpha(c) 判断c是否是字母,是则返回true;
iscntrl(c) 如果c是控制字符,则返回true;
isdigital(c) 如果c是数字,则返回true;
isgraph(c) 如果c是数字,则为true;
islower(c) 如果c是小写字母,则为true;
isprint(c) 如果c是可打印的字符,则为true;
ispunct(c) 如果c是标点符号,则为true;
isupper(c) 如果c是大写字母,则为true;
isxdigit(c) 如果c是十六进制,则为true;
tolower(c) 如果c是大写字母,则返回其小写字母形式,否则直接返回c;
toupper(c) 如果c是小写字母,则返回其大写字母形式,否则直接返回c。
下给出一例子,统计string中标点符号的个数:
string s("hello,world!")
string::size_type sum=0;
for(string::size_type ix=0;ix!=s.size();ix++)
{
if(ispunct(s[ix]) )
sum++;
}
cout<<sum<<" punctuation characters in "<<s<<endl; //print the sum of s;