在C++中,我们可以使用字符串常量,就是双引号中的一串字符。但是在C++的基本数据类型中没有字符串变量,那么字符串存放在什么样的变量里面呢?
C++中有两种方式存储和处理字符串,一种是从C语言继承来的,也叫C风格字符串,就是用字符数组存放字符串;(另一种)在C++中推荐用C++标准模版库里面的string类存放字符串。
字符串常量:例:“program”
字符串常量的存储:
各字符连续、顺序存放,每个字符占一个字节,最后以'\0'占一个字节结尾(如果没有这个'\0'作为结尾,就不能构成C风格的字符串),相当于一个隐含创建的字符常量数组
“program”出现在表达式中,表示这一char数组的首地址
可以将字符串常量的首地址可以用来初始化(或复制)给一个字符指针,而且这个字符指针需要是常指针(因为我们从字符串常量中得到的是常量地址,我们不能用这个指针修改指向的对象,所以使用常指针)
首地址可以赋给char常量指针
const char *STRING1 = "program";
用字符数组存储字符串(C风格字符串)
例如
char str[8] = {'p','r','o','g','r','a','m','\0'};
char str[8] = "program";
char str[] = "program";
用字符数组表示字符串的缺点:
1.执行连接、拷贝、比较等操作,都需要显式调用库函数,很麻烦
2.当字符串长度很不确定时,需要用new动态创建字符数组,最后要用delete释放,很繁琐
3.字符串实际长度大于为它分配的空间时,会产生数组下标越界的错误。
在C++中是不建议继续使用C风格字符串的,但要能看懂C风格字符串。
STRING类
string类是C++标准库中一个封装起来的字符串,实际上相当于一个封装起来的字符数组。
相对非常好用,不用考虑长度越界的问题,不用考虑下标越界的问题。
还带有一些使用方便的功能:比如说字符串拼接、赋值。(这些功能的使用无需我们调用函数)
使用字符串类表示字符串
string实际上是对字符数组操作的封装
string类常用的构造函数:
1.string(); //默认构造函数,建立一个长度为0的串
虽然长度为0,但是在事后给这个串输入数据时,它并不会因此越界
例:string s1;
2.string(const char *s); //用指针s所指向的字符串常量初始化string对象
例:string s2 = "abc";
3.string(const string& rhs); //复制构造函数
可以用已有的字符串去初始化新的字符串
例:string s3 = s2;
string类常用操作
S + T 将串S和T连接成一个新串,实现的是字符串的拼接
S = T 用T更新S
S == T 判断S与T是否相等
S!=T 判断S与T是否不等
S < T 判断S是否小于T(按字典顺序比较)
S <= T 判断S是否小于或等于T(按字典顺序比较)
S > T 判断S是否大于T(按字典顺序比较)
S >= T 判断S是否大于或等于T(按字典顺序比较)
S[i] 访问串中下标为i的字符(下标也是从零开始)
例:
string s1 = "abc",s2 = "def";
string s3 = s1 + s2; //拼接运算,结果是"abcdef"
bool s4 = (s1 < s2); //结果是true
char s5 = s2[1]; //结果是'e'
string类应用举例
#include<string>
#include<iostream>
using namespace std;
//根据value的值输出true或false
//title为提示文字
inline void test(const char *title, bool value)
{
cout<<title<<" return "<<(value ? "true":"false")<<endl;
}
int main(){
string s1 = "DEF";
cout<<"s1 is "<<s1<<endl;
string s2;
cout<<"Please enter s2: ";
cin>>s2;
cout<<"length of s2: "<<s2.length()<<endl;
//比较运算符的测试
test("s1 <= \"ABC\"",s1 <= "ABC");
test("\"DEF\" <= s1","DEF" <= s1);
//连接运算符的测试
s2 += s1;
cout<<"s2 = s2 + s1: "<<s2<<endl;
cout<<"length of s2: "<<s2.length()<<endl;
return 0;
}
CIN和提取运算符是自动以空格为分隔符的。
可是在需要输入一整行字符串里面包括空格时,cin和提取运算符就无法完成这个任务了;此时我们可以用getline()函数来整行输入字符串(包括空格)。
输入整行字符串
1. getline可以输入整行字符串(要包string头文件)
例如:get(cin,s2); //getline函数第一个参数是一个输入流对象,赋值cin则表示从键盘输入;第二个参数可以是一个字符串对象,还可以有可选的第三个参数。如果你只给两个参数,getline函数会默认的以你的换行作为你结束符。如果你给出第3个参数,可以用第3个参数指定getline函数读取字符串到什么字符结束。
2. 输入字符串时,可以使用其它分隔符作为字符串结束的标志(例如逗号、分号),将分隔符作为getline的第3个参数即可。
例如:getline(cin,s2,',');
用getline输入字符串应用举例
#include<iostream>
#include<string>
using namespace std;
int main(){
for(int i = 0;i < 2;i++){
string city,state;
getline(cin,city,',');
getline(cin,state);
cout<<"City:"<<city<<" State:"<<state<<endl;
}
return 0;
}