字符串

       在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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值