【题目】
给定一个字符串str,返回str的统计字符串。
【举例】
"aaabbadddffc"的统计字符串为"a_3_b_2_a_1_d_3_f_2_c_1"。
【实现】
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string str;
getline(cin,str);
if (str == "" || str.size() < 1)
{
cout << "";
return 0;
}
string res="";
res += str[0];
int count = 1;
for (int i = 1; i < str.size(); i++)
{
if (str[i] != str[i - 1])
{
res = res + "_" + to_string(count) + "_" + str[i];
count = 1;
}
else
{
count++;
}
}
res = res + "_" + to_string(count);
cout << res;
return 0;
}
【知识点】
1、C++中常用的字符串操作函数(以char *作为操作对象):
①函数名: strcpy
功 能: 拷贝一个字符串到另一个
用 法: char *strcpy(char *destin, char *source);
②函数名: strcat
功 能: 字符串拼接函数
用 法: char *strcat(char *destin, char *source);
③函数名: strchr
功 能: 在一个串中查找给定字符的第一个匹配之处
用 法: char *strchr(char *str, char c);
④函数名: strcmp
功 能: 串比较
用 法: int strcmp(char *str1, char *str2);
看Asic码,str1>str2,返回值 > 0;两串相等,返回0
⑤函数名: strcspn
功 能: 在串中查找第一个给定字符集内容的段
用 法: int strcspn(char *str1, char *str2);
⑥函数名: strdup
功 能: 将串拷贝到新建的位置处
用 法: char *strdup(char *str);
⑦函数名: stricmp
功 能: 以大小写不敏感方式比较两个串
用 法: int stricmp(char *str1, char *str2);
⑧函数名: strrev
功 能: 串倒转
用 法: char *strrev(char *str);
⑨函数名: strset
功 能: 将一个串中的所有字符都设为指定字符
用 法: char *strset(char *str, char c);
⑨函数名:strtok
功能: strtok()将字符串分割成一个个片段。
用法:char *strtok(char *s,const char *delim);
简介:s指向要分割的字符串,delim为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为/0字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。返回值返回下一个分割后的字符串指针,如果已无从分割则返回NULL。
#include <iostream>
#include <string>
#include<vector>
using namespace std;
#pragma warning( disable : 4996)
int main()
{
char str[50000];
gets(str);
vector<char*> vec;
char * ptr = strtok(str, "#");
while (ptr != NULL){
vec.push_back(ptr);
ptr = strtok(NULL, "#");
}
for (int i = 0; i<vec.size(); i++)
{
cout << vec[i] << endl;
}
return 0;
}
2、C++中常用的字符串操作函数(以string作为操作对象):
①比较函数:
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=),在使用>,>=,<,<=这些操作符的时候是根据“当前字符特性”将字符按字典顺序进行逐一得比较。字典排序靠前的字符小,比较的顺序是从前向后比较,遇到不相等的字符就按这个位置上的两个字符的比较结果确定两个字符串的大小。同时,string (“aaaa”) <string(aaaaa)。
另一个功能强大的比较函数是成员函数compare()。他支持多参数处理,支持用索引值和长度定位子串来进行比较。他返回一个整数来表示比较结果,返回值意义如下:0-相等〉0-大于 <0-小于。
例如:string s(“abcd”);
s.compare(“abcd”); //返回0
s.compare(“dcba”); //返回一个小于0的值
s.compare(“ab”); //返回大于0的值
②更改内容:
a)可以使用操作符=直接进行赋值;
b)可以使用成员函数assign(),这个成员函数可以使你更灵活的对字符串赋值。
例如:s.assign(str); //直接赋值
s.assign(str,1,3);//如果str是”iamangel” 就是把”ama”赋给字符串
s.assign(str,2,string::npos);//把字符串str从索引值2开始到结尾赋给s
s.assign(“gaint”); //直接赋值
s.assign(“nico”,5);//把’n’ ‘I’ ‘c’ ‘o’ ‘\0’赋给字符串
s.assign(5,’x’);//把五个x赋给字符串
c)把字符串清空的方法有三个:s=””;s.clear();s.erase();s.erase(13);//从索引13开始往后全删除
s.erase(7,5);//从索引7开始往后删5个
d)增加字符:
1)在字符串末尾增加:函数有 +=、append()、push_back()。(其中append()用法和上面assign()用法 一样。
2)在字符串的某个位置插入:这时候可以用insert()函数,这个函数需要指定一个安插位置的索引,被插入 的字符串将放在这个索引的后面。s.insert(0,”my name”); s.insert(1,str);
e)替换字符串:string s=”il8n”;
s.replace(1,2,”nternationalizatio”);//从索引1开始的2个替换成后面的C_string
#include<string>
#include<iostream>
using namespace std;
//第一种替换字符串的方法用replace()
void string_replace(string&s1,const string&s2,const string&s3)
{
string::size_type pos=0;
string::size_type a=s2.size();
string::size_type b=s3.size();
while((pos=s1.find(s2,pos))!=string::npos)
{//find函数中的pos:从string的pos位置开始寻找(注意第一个位置是0)。
s1.replace(pos,a,s3);
pos+=b;
}
}
//第二种替换字符串的方法用erase()和insert()
void string_replace_2(string&s1,const string&s2,const string&s3)
{
string::size_type pos=0;
string::size_type a=s2.size();
string::size_type b=s3.size();
while((pos=s1.find(s2,pos))!=string::npos)
{
s1.erase(pos,a);
s1.insert(pos,s3);
pos+=b;
}
}
f)提取子串:s.substr();//返回s的全部内容
s.substr(11);//从索引11往后的子串
s.substr(5,6);//从索引5开始6个字符
③字符串逆转(使用algorithm中的reverse函数):
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
string s = "hello";
reverse(s.begin(),s.end());
cout<<s<<endl;
return 0;
}
3、数值型与字符型数据转换:
①字符串转换为数值型:
atoi(p) 字符串转换到 int 整型
atof(p) 字符串转换到 double 符点数
atol(p) 字符串转换到 long 整型
②数值型转换为字符串:
to_string函数(C++ 11新增)
使用字符串流转换:
string Int_to_String(int n)
{
ostringstream stream;
stream<<n; //n为int类型
return stream.str();
}