天天看点

c++学习:字符串string

本文用来记录学习string过程中的收获,会不时更新。

string是c++标准库类型,表示可变长的字符序列,C语言中没有此类型。

1.头文件

使用string类型必须包含string头文件。

#include <string>
           

注意和

cstring

区分。

cstring

可以理解为

string.h

的升级版,它们包含原来C语言中的strcpy等函数。

2.定义和初始化string对象

常用的方法

string s1;//默认是一个空字符串""
string s2=s1;//s2是s1的副本
string s3(s2);//s3是s2的副本
string s4="hello world";//s4是字符串字面值的副本
string s5("hello world");//同s4
string s6(5,'h');//s6初始化为"hhhhh"
           

s2,s4初始化方式是拷贝初始化;s3,s5,s6是直接初始化。

3.读写

  • 读写string
    int main()
    {
        string s;
        cin>>s;
        cout<<s;
    }
               
    读取输入时,string对象会自动忽略开头的空白(空格,回车,制表),知道遇到下一处空白为止。于是当输入的是" hello world! “时,输出的却是"hello”。
  • getline 读取一整行

    c++primer中写到

    c++学习:字符串string
    触发getline函数返回的那个换行符实际上被丢弃掉了,得到的string对象中并不包含该换行符。
    istream& getline (istream& is, string& str, char delim);
    istream& getline (istream& is, string& str);
               
    第三个参数是分隔符,可以自定义,默认是换行符。如:
    int main()
    {
       string s;
       getline(cin,s,'g');
       cout<<s;
    }
               

    输入:today is a good day

    输出:today is a

4.操作字符

  • toupper/tolower

    可以进行大小写转换。但此函数仅适用于单个字符串,不能直接对字符串使用。可以结合transform转换整个字符串。如:

    #include <iostream>
    #include <string>
    #include <algorithm>
    using namespace std;
    int main()
    {
       string s;
       getline(cin,s,'r');
       transform(s.begin(),s.end(),s.begin(),::toupper);
       cout<<s;
    }
               

输入:hello world

输出:HELLO WO

5.搜索操作

string类提供了6个不同的搜索函数,每个函数都有4个重载版本。每个搜索操作都返回一个string::size_type值,是一个无符号的长整数,如果搜索失败,则返回一个名为string::npos的常量。

  • find函数完成最简单的搜索。它查找指定的字符串,若找到,则返回第一个匹配位置的下表,否则返回npos,并且搜索时对大小写敏感。
    string s("to be or not to be this is a question");
    cout<<s.find("is");
               

    输出21,即"is"字符串第一次出现的位置。

    然而实际上如果我们想查找的是单词is在句子中出现的位置该如何操作呢?

    #include <iostream>
    #include <string>
    #include <cstring>//getchar()
    #include <algorithm>
    using namespace std;
    int main()
    {
        string word,s;//定义单词和句子
        cin>>word;
        word=" "+word+" ";
        getchar();//消除输入word时空白符的影响。
        getline(cin,s);
        s=" "+s+" ";
        cout<<s.find(word)-1;
    }
               

    输出:23

    上述程序在word和s前后都加上了一个空格,从而解决了这个问题。比先匹配字符串在判断是否为单独的单词要简洁。

继续阅读