C/C++STL标准模板库(四)——string

//string封装了字符串相关的操作
//内部实现和vector类似,操作接口上增加了字符串的接口。
//string内部仍然是一个char型数组,并且也是以0结尾的。对外提供了常用的函数。
//如:append,clear,at,length等操作,并支持赋值、复制等操作。
1.构造string的几种方式

string str1 ("xiaoming");//以C风格构造字符串 
string str2 = "wanghua" ;//同上一种方式
string str3 ("abcde",5) ;//参数1是字符串,参数2是长度
string str4; //空字符串
string str5 = ""; //同上,空字符串 

取得字符串内部的char*

 string str = "xiaoming " ;
 const char* p = str.c_str();

2.append/clear
append:在末尾添加字符或者字符串

 string str;
 str.append("something else");//附加一个字符串 
 str.append("abcde",5);//附加一个字符串,拷贝5个字符 
 str.append("abcde",1,3);//拷贝1-3位置的字符,“bcd” 
 str.append(2,'h');//附加2个h
 

string重载了操作符+ =,也是用于附加字符串的功能

 str +="hello";
 str +='h';

3.size/capacity/resize/clear/length
size/length:已经储存的字符长度
capacity:容量
resize:显式的设置string内部缓冲区的容量
clear:清楚所有字符。

 string str;
 str.resize(1024);
 str.clear();
 str.append();
 str.append();
 ....... 

4.at
at用于按索引访问字符,返回的是一个引用。因此可以用at来改变字符串的内容。
例如:
str.at(0)=‘k’;
char ch = str.at(0);
string 也重载了操作符[],作用与at相同。
str[0]=‘k’;//推荐使用!!

5.字符串的比较
string重载了关系符,字符串可以比较大小

6.字符串的查找
find函数用于查找一个字符或者字符串,从左往右查找,直到第一次,返回匹配的位置,如果没有匹配的,则返回-1.
例如:
string str(“Liming is doing homework!”);
int pos = find(‘i’);
如果原字符串包含多个i,则返回第一个所在的位置(偏移)。
如果想往后查找,就需要设置第二个参数,该参数表示起始位置偏移 。
例如:
int pos = find(‘i’,offset) ;
也可以查找子串:
int pos = find(“ing”) ;
返回的是第一次出现的位置

find_first_of:查找第一个~字符
find_first_not_of:查找第一个非~字符

7.substr
用于拷贝部分子串,带两个参数。第一个参数:offset,表示起始位置,第二个参数,表示要截取的子串长度,如果第二个省略,默认截取到结束

8.string作为函数参数
常见的:
void test(const& string str);
void test(string& str);
一般不直接用string str,因为这仅仅是传值,没效率 。

#include <stdio.h>
#include <string.h>

#include <string>
using namespace std;

// 1号方式
void test(const string& t)
{
}
// 2号方式
void test(string& t)
{
}
// 这种方式避免使用,请参考1号方式
void test(string t)
{
}

int main()
{
// 	string str1 ("LiMing");    // 以一个C风格字符串构造
// 	string str2 = "WangHua";  // 同上一种方式
// 	string str3 ("abcde", 3);    // 参数1是C字符串,参数2参数是长度
// 	string str4;  // 空字符串
// 	string str5 = "";  // 同上,空字符串

	// string str6 = NULL; // 不能初始化为NULL

	// 取得字符串内部的char*
	string text("hello,world!\n");
	const char* p = text.c_str();
	printf("str: %s \n", text.c_str());

	// 
	string t1;
	t1.append("something else");	// 附加一个字符串
	t1.append("abcde", 5);    // 附加一个字符串:拷贝前5个字符
	t1.append("abcde", 1, 3);  // 附加一个字符串:
	// 起点offset=1, 长度3,即拷贝"bcd"
	t1.append(4, 'h'); // 附加2个’h’字符

	// 考虑效率问题
	string t2;
	t2.resize(1024);
	t2.clear();
	t2.append("ab");
	t2.append("cd");

	// 
	string t3 = "hello";
	t3[1] = 'i'; // 推荐使用
	t3.at(1) = 'c'; // 不推荐

	// 字符串的比较
	string t4 = "yes";
	if( t4 == "yes")
	{
		printf("相等\n");
	}

	// 字符串的查找
	string t5 = "LiMing is doing homework";
	int p1 = t5.find('i');   // 返回1
	int p2 = t5.rfind('e');   // 
	// 存在,则返回其位置;否则,返回-1

	// 返回子串
	string t6 ("abcdefg");
	string r1 = t6.substr(4); // 返回"efg"
	string r2 = t6.substr(4,2); // 返回"ef"

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值