OJ的自我修养:C++字符字符串处理

1. string类

1.1 常见函数

1.1.1 获取字符

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str="God bless you!";
  cout<<str[1]<<endl;//直接通过下标进行索引
  cout<<str.at(1)<<endl;//通过函数返回字符
  return 0;
}

1.1.2 字符串属性

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str="God bless you!";
  cout<<str.size()<<endl;//返回字符串长度
  cout<<str.length()<<endl;//返回字符串长度
  cout<<str.empty()<<endl;//判断字符串是否为空,为空返回1,否则返回0
  cout<<str.back()<<endl;//输出字符串的尾部
  cout<<*str.begin()<<endl;//输出字符串的头部 
  return 0;
}

1.1.3 交换字符串

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str1="God bless you!";
  string str2="Father be with you!";
  str1.swap(str2);//把 str1 与 str2 交换
  cout<<str1<<endl;
  return 0;
}

1.1.4 删除字符串

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str1="God bless you!";
  string str2="Father be with you!";
  str1.erase(3);//删除[3]及以后的字符,并返回新的字符串
  str2.erase(3,5);//删除从 [3] 开始的后 5 个字符,并返回新字符串
  cout<<str1<<endl;
  cout<<str2<<endl;
  return 0;
}

1.1.5 追加字符(串)

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str = "God bless you!";
  str.push_back('&');//在str的末尾添加字符'&',注意只能是字符,不能是字符串如"&"
  str.append("Father be with you!");//在 str 末尾添加字符串
  cout<<str<<endl;

  return 0;
}

1.1.6 插入字符串

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str = "God bless you!";
  str.insert(0,"Father&");//从位置0开始添加字符串
  cout<<str<<endl;
  str.insert(0,"Maybe",3);//从位置0开始插入字符串"Maybe”的前三个即“May”
  cout<<str<<endl;
  str.insert(0,"You Wish",4,4);//从位置0开始插入子串"You Wish"从[4]开始的后四个字符,即"Wish"
  cout<<str<<endl;
  return 0;
}

1.1.7 替换字符串

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str = "God bless you!";
  str.replace(0,3,"Father");//把str从[0]开始的3个字符,即God替换为Father
  cout<<str<<endl;
  str.replace(0,6,"God be with you!",3);//把str从[0]开始的6个字符,即Father替换God
  cout<<str<<endl;
  return 0;
}

1.1.8 获取字符串子串

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str = "God bless you!";
  cout<<str.substr(4)<<endl;//返回从[4]开始的后所有字符,即bless you!
  cout<<str.substr(4,5)<<endl;//返回[4]以后的5个字符,即bless
  return 0;
}

1.1.9 查找子串

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str = "God bless you!";
  cout<<str.find("God")<<endl;//返回God在str中的起始位置,即0
  cout<<str.find("God",3)<<endl;//在 str[3]~str[n-1] 范围内查找并返回字符串 God 在 str 的位置,即npos=4294967295
  cout<<string::npos<<endl;
  cout<<str.rfind("God",3)<<endl;//在 str[0]~str[3] 范围内查找并返回字符串 God 在 str 的位置,即0
  return 0;
}

1.1.10 运算符重载

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str1 = "God bless you!";
  string str2 = "Father be with you!";
  cout<<"May "+str1+str2<<endl;//字符串连接,至少有一个string类型
  // cout<<"God"+"Bless"+"You!"<<endl; 这是不行的,会报错的
  cout<<(str1==str2)<<endl;//输出false,即0

  string str = s + '!'+ '!'; // 正确
  cout << str << endl;

  return 0;
}

1.2 常见应用

1.2.1 去除一个字符串中的所有空格

#include <string>
#include<iostream>

using namespace std;

/*返回去除空格的字符串*/
string rmSpace(string s){
    while(s.find(" ")!=s.npos){
        s.replace(s.find(" "),1,"");
    }
    return s;
}

int main()
{
  string str;
  getline(cin,str);
  str = rmSpace(str);
  cout<<str<<endl;
  return 0;
}

1.2.2  将一个字符串统一大小写

#include <string>
#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
  string str;
  getline(cin,str);

  transform(str.begin(),str.end(),str.begin(),::toupper);//统一转换为大写
  cout<<str<<endl;

  transform(str.begin(),str.end(),str.begin(),::tolower);//统一转换为小写
  cout<<str<<endl;

  return 0;
}

1.2.3 字符串分割

1) 使用find函数和substring函数

#include<iostream>
#include<string>
#include<vector>

vector<string> split(const string &str, const string &pattern)
{
    vector<string> res;
    if(str == "")
        return res;
    //在字符串末尾也加入分隔符,方便截取最后一段
    string strs = str + pattern;
    size_t pos = strs.find(pattern);

    while(pos != strs.npos)
    {
        string temp = strs.substr(0, pos);
        res.push_back(temp);
        //去掉已分割的字符串,在剩下的字符串中进行分割
        strs = strs.substr(pos+1, strs.size());
        pos = strs.find(pattern);
    }

    return res;
}

2)使用stringstream

#include<iostream>
#include<string>
#include<vector>
#include<sstream>

using namespace std;

vector<string> split(const string &str, const char pattern)//注意pattern只能是字符,如" "是错误的
{
    vector<string> res;
    stringstream input(str);   //读取str到字符串流中
    string temp;
    //使用getline函数从字符串流中读取,遇到分隔符时停止,和从cin中读取类似
    //注意,getline默认是可以读取空格的
    while(getline(input, temp, pattern))
    {
        res.push_back(temp);
    }
    return res;
}

1.2.4 字符串类型转换

#include<iostream>
#include<string>

using namespace std;

int main()
{
    //int --> string
    int i = 5;
    string s = to_string(i);
    cout << s << endl;
    //double --> string
    double d = 3.14;
    cout << to_string(d) << endl;
    //long --> string
    long l = 123234567;
    cout << to_string(l) << endl;
    //char --> string
    char c = 'a';
    cout << to_string(c) << endl;   //自动转换成int类型的参数
    //char --> string
    string cStr; cStr += c;
    cout << cStr << endl;


    s = "123.257";
    //string --> int;
    cout << stoi(s) << endl;
    //string --> int
    cout << stol(s) << endl;
    //string --> float
    cout << stof(s) << endl;
    //string --> doubel
    cout << stod(s) << endl;

  return 0;
}

1.2.5 实现trim函数

string& Trim(string &s)
{
    if(s.empty()){
        return s;
    }
    s.erase(0,s.find_first_not_of(" "));
    s.erase(s.find_last_not_of(" ")+1,s.size()-1);
    return s;
}

2. 字符处理

2.1 string转char

#include <string>
#include<iostream>

using namespace std;

int main()
{
  string str = "God bless you!";
  char c = str[0];//直接获取字符
  cout<<c<<endl;
  char b = c + 32;//直接进行ASCII的运算,输出g
  cout<<b<<endl;

  return 0;
}

2.2 char转string

#include<iostream>
#include<string>

using namespace  std;

int main()
{
    string str = "god bless you!";
    string ch_s = to_string(str[0]);
    cout<<ch_s<<endl;// 103,输出的是ASSII的值哦
    cout<<typeid(ch_s).name()<<endl;

    string ch_s(1,str[0]); //利用string的构造函数
    cout<<ch_s<<endl;// 
    cout<<typeid(ch_s).name()<<endl;

    return 0;
}

2.3 判断字符的类型

#include <iostream>

using namespace std;

int main() {
    cout << isdigit('8') << endl; // 判断是否是数字
    cout << isalnum('g') << endl; // 判断是否是字母或数字
    cout << isspace(' ') << endl; // 判断是否是空格
    cout << islower('a') << endl; // 判断是否是小写
    cout << isupper('A') << endl; // 判断是否是大写
    cout << isalpha('y') << endl; // 判断是否是字母
    cout << tolower('G') << endl; // 将大写字母转为小写字母
    cout << toupper('d') << endl; // 将小写字母转为大写字母
   return 0;
}

3. 参考资料

[1]   C++ string 字符串函数详解

[2] 【整理】C++ string转int,string转double

[3]   c++ 将一个char 转化为string

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值