头文件
#include <string>
using std::string;
初始化
#include <iostream>
#include <string>
using std::string;
using namespace std;
int main(){
// 几种不同的声明和初始化方式
string s1;
string s2(s1);
string s3("value");
string s4(10, 'c');
cout << "s1: " << s1 << endl;
cout << "s2: " << s2 << endl;
cout << "s3: " << s3 << endl;
cout << "s4: " << s4 << endl;
system("pause");
return 0;
}
运行结果:
string对象的读写
int main(){
// string对象的读与写
string s,s1;
cin >> s >> s1;
cout << s << " , " << s1 << endl;
system("pause");
return 0;
}
string类型的输入操作符需要注意的时:
1)读取并忽略开头所有的空白字符(如空格、换行符、制表符等);
2)读取字符直至再次遇到空白字符,读取终止。
循环读入string对象
int main(){
// string对象的读与写
string word;
cout << "input a word, Ctrl + Z to end !" << endl;
// 遇到文件尾结束读取
while (cin >> word){
cout << word << endl;
}
system("pause");
return 0;
}
注意:这个是读取到空白字符就会得到一个string对象。
使用getline按行读取文本
int main(){
// string对象的读与写
string word;
cout << "input a word, Ctrl + Z to end !" << endl;
// 遇到文件尾结束读取,每次输出一行文本
while (getline(cin, word)){
cout << word << endl;
}
system("pause");
return 0;
}
注意:这个只要/有遇到换行符才会得到一个string对象,也就是说
1)这种方式string可以包含其他空白字符;
2)如果刚开始来就是换行就会得到一个空的字符;
3)getline函数返回时回丢弃换行符,换行符不会存储在string对象中。
size与empty操作
1、使用size()返回string长度
int main(){
// size()返回string长度
string word("The CQUer is hard-working");
cout << "The size of " << word << " is " << word.size() << " characters!" << endl;
system("pause");
return 0;
}
结果:
The size of The CQUer is hard-working is 25 characters!
2、empty()判断字符是否为空,与判断size是否为0等效
int main(){
// empty()判断字符是否为空
string word;
cout << (word.size() == 0) << endl;
cout << word.empty() << endl;
system("pause");
return 0;
}
结果:
1
1
关于string::size_type
它是标准库中定义的配套类型,定义为与unsigned型(unsigned int或unsigned long)有相同含义,下面解释下为什么要使用这种类型而不用int型:
1)虽然不知道它的确切类型,但是可以知道他是unsigned型,其最大正数值比对应的signed型要大一倍,它可以保证足够大能够存储任意string对象的长度。
2)有些机器上int变量的表示范围太小,甚至无法存储实际并不长的string对象(16位int型机器上,int型最大能表示32767个字符,而容纳一个文件内容的string对象很轻易就回超过这个数字)。库类型的使用与机器无关,因此为了避免溢出,保存一个string对象size最安全的方法就是使用标准库类型string::size_type。
关系操作符
1、==,!=
判断两个字符串是否相等/不等。
2、<,<=,>,>=
string对象是大小写敏感的,关系操作符比较两个string对象时采用字典排序相同的策略:
1)两个string长度不同,且短的string与长的string前面部分时匹配的,则短的string小于长的string;
2)如果两个string对象字符不同,则比较第一个不匹配的字符。
举例说明:
string substr="Hello";
string phrase="Hello World";
string slang ="Hiya";
根据字典序,有这样的关系:substr < phrase < slang
赋值操作
string st1, st2 = "CQUer";
st1 = st2;
赋值操作会遇到一些效率问题,如下:
首先把st1 占用的相关内存释放掉,然后分配给st1足够存放st2副本的内存空间,最后把st2的所有字符复制到新分配的内存空间。
两个string相加
int main(){
string s1("Hello ");
string s2("World !");
string s3 = s1 + s2;
cout << s3 << endl;
s1 += s2;
cout << s1 << endl;
system("pause");
return 0;
}
结果:
Hello World !
Hello World !
和字符串字面值连接
和字符串字面值混合连接时,+操作符的左右操作数必须至少有一个时string类型的。
string s1("Hello ");
string s2("World !");
string s3 = s1 + ", " + s2 + "\n";
也就是,至少要有一个string对象参与相加,不能直接将两个字符串字面值相加起来。
string s1("Hello ");
string s2("World !");
string s3 = s1 + ", " + s2 + "\n";
string s4 = "hello" + ","; // ×,不能直接两个字符串字面值相加
string s5 = s1 + "," + "world !"; // √,s1 + ","返回的是一个string对象可以继续往后面加
string s6 = "hello" + "," +s2; // ×,依此从左至右,前面两个字符串字面值相加了,不允许
string对象获取字符
可以用下标操作访问/操作string的某一个字符,下标的类型是size_type,如下用下标分别取出每一个字符。
int main(){
string s("Hello ");
for (string::size_type ix = 0; ix != s.size(); ix++)
cout << "s[" << ix << "] = " << s[ix] << endl;
system("pause");
return 0;
}
结果:
s[0] = H
s[1] = e
s[2] = l
s[3] = l
s[4] = o
s[5] =
下标可用作左值
下标操作用作左值可以对string中某一位进行置位操作。
int main(){
string s("Hello ");
for (string::size_type ix = 0; ix != s.size(); ix++)
cout << "s[" << ix << "] = " << s[ix] << endl;
s[2] = 'm';
cout << s << endl;
system("pause");
return 0;
}
结果:
s[0] = H
s[1] = e
s[2] = l
s[3] = l
s[4] = o
s[5] =
Hemlo
字符处理
string s("Hello ");
isalnum(s[0]); // 是否是字母或数字,是返回true
isalpha(s[0]); // 是否是字母
iscntrl(s[0]); // 是否为控制字符
isdigit(s[0]); // 是否为数字
isgraph(s[0]); // 如果不是空格,但可打印,则true
islower(s[0]); // 是否为小写字母
isprint(s[0]); // 是否为可打印字符
ispunct(s[0]); // 是否为标点符号
isspace(s[0]); // 是否为空白字符
isxdigit(s[0]); // 是否为十六进制数
tolower(s[0]); // 返回小写字母形式
toupper(s[0]); // 返回大写字母形式