欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;

}

 

相关标签: STL