STL string类
程序员文章站
2022-03-01 23:21:21
...
string类
字符函数
c++中应该是#include <cctype>
c中应该是#include <ctype.h>
函数名称 | 返回值 |
isalnum() | 如果参数是字母数字,即字母或数字,该函数返回true |
isalpha() | 如果参数是字母,该函数返回真 |
isblank() | 如果参数是空格或水平制表符,该函数返回true |
iscntrl() | 如果参数是控制字符,该函数返回true |
isdigit() | 如果参数是数字(0~9),该函数返回true |
isgraph() | 如果参数是除空格之外的打印字符,该函数返回true |
islower() | 如果参数是小写字母,该函数返回true |
isprint() | 如果参数是打印字符(包括空格),该函数返回true |
ispunct() | 如果参数是标点符号,该函数返回true |
isspace() |
如果参数是标准空白字符,如空格、进纸、换行符、回车 、水平制表符或者垂直制表符,该函数返回true |
isupper() | 如果参数是大写字母,该函数返回true |
isxdigit() | 如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true |
tolower() | 如果参数是大写字符,则返回其小写,否则返回该参数 |
toupper() | 如果参数是小写字母,则返回其大写,否则返回该参数 |
string 的基本操作
#include"iostream"
#include"string"
#include"algorithm"
#include"cctype" //c++头问价cname c头文件name.h
using namespace std;
//os<<s 将s写到输出流os当中,返回os
//is>>s 从is 中读取字符串给s,返回is
//getline(is,s) 从is中读取一整行赋给s,返回is
//s.empty() s为空返回true
//s.size() s.length() 长度,基本没区别
//s[n]
//s1+s2 s1.append(s2)
//s1 == s2 s1!=s2 > < <= >=
//修改操作 .erase() .insert() .replace() .append() .assign()
//to_string() stoi() stof() stod() 数之间的转换
//读入
void readString()
{
cout << "please input Hello World" << endl;
string s,s1,s2;
cin >> s; //将string 对象读入s。遇到空白(空格换行制表符)停止
cout << s << endl;//Hello
cout << "please input Hello World" << endl;
cin >> s1 >> s2;//第一个s1 第二个s2链式编程
cout << s1<<s2 << endl;//HelloWorld
//读取未知数量string
string word;
/*while (cin >> word)//流有效则继续读,非法输入或文件结束符标记循环结束crtl+z
cout << word;
cout << endl;*/
//getline(cin string line)按照行读,遇到换行符停止,从给定的输入流cin读(包括换行符)在将内容读入line
string line;
while (getline(cin, line))
cout << line << endl;
}
//初始化操作
void StringInitial()
{
string s1 = "aaaa";
string s2("bcdrfghijklmn");
string s3 = s2;//拷贝构造函数来初始化
string s4(10, 'c');
string s5 = s3.substr(5, 8);//子串初始化
cout << "s1:" << s1 << endl;
cout << "s2:" << s2 << endl;
cout << "s3:" << s3 << endl;
cout << "s4:" << s4 << endl;
}
void StringTraverse()//遍历操作
{
string s = "sbkjbdkjsbkj";
//数组方式遍历
for (int i = 0; i < s.length(); i++)
{
cout << s[i] <<' ';
}
cout << endl;
//迭代器方式
for (string::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << ' ';
}
cout << endl;
//at方式和[]方式的区别 at会越界时返回异常 try catch 时使用较好
//[]方式在刚刚越界返回0,之后越界会直接报错中断程序
try
{
for (int i = 0; i < s.length()+3; i++)
{
cout << s.at(i) << ' ';
}
cout << endl;
}
catch (...)
{
cout << "发生异常" << endl;
}
/*try
{
for (int i = 0; i < s.length() + 3; i++)
{
cout << s[i] << ' ';//越界不会报异常,直接出错
}
cout << endl;
}
catch (...)
{
cout << "发生异常" << endl;
}*/
}
//字符串的连接
void StringCat()
{
string s1 = "abcd";
string s2 = "efgh";
string s3 = s2 + "Hello";//字面值
//string s4 = "Hellow"+"world"+s3; //错误保证每个加法两侧至少一个是string
string s4 = "Hellow" +s3+ "world";
cout << s1 + s2 << endl;
cout << s1.append(s2) << endl;
cout << s4;
}
//char转string
void charTostr()
{
string s = "aaaaabbbbb";
//s ===> char
printf("%s", s.c_str());//%s为c风格输出,必须要有\0 string没有不能这样输出
cout << endl;
//将string copy到char
char buf[256] = { 0 };//最好初始化为0,否则没有拷贝到0,则会缺失c字符串结束符\0
s.copy(buf, 5, 0);//从0开始拷贝5个字符到buf
printf("%s", buf);
}
//元素操作
void char_inSring()
{
//cctype
string str("Hello World!!!");
decltype(str.size())punct_cnt = 0;
for (auto c : str)//基于范围的for语句str部分必须是一个序列,c每次自动指向下一个元素
if (ispunct(c))
++punct_cnt;
cout << punct_cnt << endl;
//for语句改变字符串,必须用引用
for (auto &c : str)
c = toupper(c);
cout << str << endl;
}
//查找
void strFind()
{
string s = "wchsbdcnswchnalkndcalnwchnskldn";
int index1 = 0;
int index2 = 0;
index1 = s.find("wch", 0);//从0位置查找wch返回第一个wch的下标,否则返回-1
index2 = s.rfind("wch", 0);//从0位置查找wch返回最后一个wch的下标,否则返回-1
cout << index1 << endl;
//查找所有wch位置
string s2 = "wchsbdcnswchnalkndcalnwchnskldn";
int indnex = 0;
indnex = s2.find("wch", 0);
while (indnex != string::npos)//string的npos为查找失败标志
{
cout << indnex << endl;
indnex = s2.find("wch", indnex+1);//找到则加1,防止漏掉连续重复的(若寻找aaa aaaaa)
}
//替换
string s3 = "abcdgfghijk";
s3.replace(4, 3, "efg");//从下标4开始替换3个字符,替换为efg
cout << s3 << endl;
indnex = s2.find("wch", 0);
while (indnex != string::npos)//string的npos为查找失败标志
{
s2.replace(indnex, 3, "WCH");
indnex = s2.find("wch", indnex + 1);//找到则加1,防止漏掉连续重复的(若寻找aaa aaaaa)
}
cout << s2 << endl;
s3.assign("ttt");//s3替换成"ttt"同时返回指向s3的引用
}
//截断和插入
void eraserAnddelte()
{
string s1 = "hellowm hellow hellow";
string::iterator it = find(s1.begin(), s1.end(),'m');//调用algorithm的find函数
if (it != s1.end())
{
s1.erase(it);//删除
}
cout << s1 << endl;
s1.erase(s1.begin(), s1.end());//删除s1.begin 到s1.end的所有元素
cout << "s1:" << s1 << "length:" << s1.length() << endl;
//插入
string s2 ="BBBB";
s2.insert(0, "AAAA");//在0位置处插入AAAA
s2.insert(s2.size(), "BBB");
cout << s2 << endl;
}
//string和数值之间的转换
void num_string()
{
//stoi(s,p,b) p默认为0,size_t* 指针用来保存第一个为数字的下标,b基数默认为10
//stol 长整形 stoul stoull
string a = "12345";
string b = "0.22379";
size_t * start = (size_t *)3;
cout << stoi(a) << endl;//默认
cout << stoi(a, 0, 10) << endl;
//stod(s,p) double stof(s,p),stold(s,p)
cout << stod(b, 0)<<endl;
cout << stof(b) << endl;
//数值转换为string to_string()
cout << to_string(4328402).size() << endl;
cout << to_string(0.72382).size() << endl;
}
//string 类算法
void algorithmString()
{
string s1 = "AAAbbb";//调用transform算法 将从s1.begin()到s1.end()的区间内,
//转换为大写保存在s1.begin()开头的内存区间
//最后一个参数可以使 1 函数入口地址 2函数对象 3预定义的函数对象
transform(s1.begin(), s1.end(), s1.begin(), toupper);//调用stl的toupper
cout << s1 << endl;
transform(s1.begin(), s1.end(), s1.begin(), tolower);//调用stl的toupper
cout << s1 << endl;
}