C++字符串处理总结
C++字符串处理有最原始的char以及string两种方式
1.给出一个string字符串,统计里面出现的字符的个数
解决方案:使用算法库里面的count函数,使用方法是count(begin,end,‘a’),其中begin指的是起始地址,end指的是结束地址,第三个参数指的是需要查找的字符。
2.截取、拼接字符串
substr append(插入位置,字符串)
###3.字符串中不同字符的个数
用set容器去重 统计set大小
4.字符串读入int
string res;
res+=n+'0';
5.整形转string
to_string 库函数
6.找出字符串中第一个只出现一次的字符
若没有,则输出-1
可设置标志 bool flag=false;找到则置为true 若循环结束仍为false 则输出-1;
7.find函数
#include<iostream>
#include<string>
using namespace std;
int main()
{
//测试size_type find (charT c, size_type pos = 0) const noexcept;
string st1("babbabab");
cout << st1.find('a') << endl;//1 由原型知,若省略第2个参数,则默认从位置0(即第1个字符)起开始查找
cout << st1.find('a', 0) << endl;//1
cout << st1.find('a', 1) << endl;//1
cout << st1.find('a', 2) << endl;//4 在st1中,从位置2(b,包括位置2)开始,查找字符a,返回首次匹配的位置,若匹配失败,返回npos
cout << st1.rfind('a',7) << endl;//6 关于rfind,后面讲述
cout << st1.find('c', 0) << endl;//4294967295
cout << (st1.find('c', 0) == -1) << endl;//1
cout << (st1.find('c', 0) == 4294967295) << endl;//1 两句均输出1,原因是计算机中-1和4294967295都表示为32个1(二进制)
cout << st1.find('a', 100) << endl;//4294967295 当查找的起始位置超出字符串长度时,按查找失败处理,返回npos
//测试size_type find (const basic_string& str, size_type pos = 0) const noexcept;
string st2("aabcbcabcbabcc");
string str1("abc");
cout << st2.find(str1, 2) << endl;//6 从st2的位置2(b)开始匹配,返回第一次成功匹配时匹配的串(abc)的首字符在st2中的位置,失败返回npos
//测试size_type find (const charT* s, size_type pos = 0) const;
cout << st2.find("abc", 2) << endl; //6 同上,只不过参数不是string而是char*
//测试size_type find (const charT* s, size_type pos, size_type n) const;
cout << st2.find("abcdefg", 2, 3) << endl;//6 取abcdefg得前3个字符(abc)参与匹配,相当于st2.find("abc", 2)
cout << st2.find("abcbc", 0, 5) << endl;//1 相当于st2.find("abcbc", 0)
cout << st2.find("abcbc", 0, 6) << endl;//4294967295 第3个参数超出第1个参数的长度时,返回npos
return 0;
}8.非负字符串大整数相加
int carry=0;//进位
for(int i=nums1.size()-1,j=nums2.size()-1;i>=0||j>=0;i--,j--)
{
int sum=carry;
sum+=(i>=0)?nums1[i]-'0':0;
sum += (j >= 0) ? num2[j] - '0' : 0;
ret.insert(ret.begin(), '0' + sum % 10);
carry = sum / 10;
}
if(carry==1)
ret.insert(ret.begin(),'1');



9.输出质数因子
while (input != 1)
{
for (int i = 2; i <= input; i++)
{
if (input % i == 0)
{
input /= i;
cout << i << ' ';
break;
}
}
}10.分割字符串
vector<string> testSplit11(const string& in, const string& delim)
{
vector<string> ret;
try
{
regex re{ delim };
return vector<string>{
sregex_token_iterator(in.begin(), in.end(), re, -1),
sregex_token_iterator()
};
}
catch (const std::exception& e)
{
cout << "error:" << e.what() << std::endl;
}
return ret;
}void SplitString(const std::string& s, std::vectorstd::string& v, const std::string& c)
{
std::string::size_type pos1, pos2;
pos2 = s.find(c);
pos1 = 0;
while (std::string::npos != pos2)
{
v.push_back(s.substr(pos1, pos2 - pos1));
pos1 = pos2 + c.size();
pos2 = s.find(c, pos1);
}
if (pos1 != s.length())
v.push_back(s.substr(pos1));}
std::vector<std::string> split(std::string str, std::string pattern)
{
std::string::size_type pos;
std::vector<std::string> result;
str += pattern;//扩展字符串以方便操作
int size = str.size();
for (int i = 0; i<size; i++)
{
pos = str.find(pattern, i);
if (pos<size)
{
std::string s = str.substr(i, pos - i);
result.push_back(s);
i = pos + pattern.size() - 1;
}
}
return result;
}
int main()
{
std::string str = "C:/Users/EHome_LJG/Desktop/images/3.jpg";
std::string pattern = ".";
std::vector<std::string> result = split(str, pattern);
std::cout << "The result:" << std::endl;
for (int i = 0; i<result.size(); i++)
{
std::cout << result[i] << std::endl;
}
return 0;
}
查看12道真题和解析