【学习笔记】《STL使用入门教程》第一讲:STL的string类型的使用方法

晓石头的博客
邮箱:178673693@qq.com
转载请注明出处,原文链接:http://blog.csdn.net/qiulanzhu/article/details/50450424


一、string的构造函数 

1.默认构造函数

string();

例:string str1;

 

2.拷贝构造函数

stringconst string &str);

例:string str2(sr1);

 

3.带参构造函数

stringconst char *s);

例:string str3("abcdef");

 

string(int n, char c);

例;string str4(5, 'a');

 

----------------------------------------------------------------------------------------------------------------------

二、string的赋值

 

string &operator=(const string &s);

例:

string str1 = "abc";

string str2 = str1;

 

string &assign(const char *s);

例:str.assign("abcdef");

 

string &assign(const char *s, int n);

例:str.assign("abcdef", 3);

 

string &assign(const string &s, int start, int n);

例:str.assign("abcdefgh", 2, 2);

 

----------------------------------------------------------------------------------------------------------------------

三、string类的字符操作

 

1.取字符串中的某一个字符,用操作符[]

const char &operator[](int n) const;

例:

string str = "abcdefg";

char ch1 = str[2];

 

2.取字符串中的某一个字符,用at

const char &at(int n) const;

例:char ch2 = str.at(2); //越界后,能够抛出异常被捕获

 

3.修改字符串中的某一个字符,用操作符[]

char &operator[](int);

例:str[3] = 'z';

 

4.修改字符串中的某一个字符,用at

char &at(int n);

例:str.at(4) = 'x';

 

 

----------------------------------------------------------------------------------------------------------------------

四、字符串输出

 

例:cout<<str.c_str();

如果包含了头文件#include<string>,可以直接输出:cout<<str<<endl;

 

----------------------------------------------------------------------------------------------------------------------

五、把string拷贝到char*指向的内存空间

 

int copy(char *s, int n, int pos=0);

char *s:要拷贝的目标位置

int n:拷贝的个数

int pos:拷贝的起始位置,不填默认为0

返回值:拷贝的个数

例:

string str = "abcdef";

char ch[100] = {0};

int count = str.copy(ch, 5);

 

----------------------------------------------------------------------------------------------------------------------

六、string的长度

 

int length() const; //返回字符串长度,不包含‘\0'

例:int lenth = str.length();

 

int size() const;//length()

例:int strSize = str.size();

 

bool empty() const;//判断当前字符串是否为空

例:bool flag = str.empty();

 

----------------------------------------------------------------------------------------------------------------------

七、字符串比较

 

int compare(const string &s) const;//按字典顺序,越前约小,>:返回1<:返回-1==:返回0

例:

string str1 = "abc";

string str2 = "xyz";

str1.compare(str2);

 

int compare(const char *s) const;//按字典顺序,越前约小,>:返回1<:返回-1==:返回0

:

strint str1 = "abc";

char *ch = "xyz";

str1.compare(ch);

 

----------------------------------------------------------------------------------------------------------------------

八、string的子串

 

string substr(ing pos = 0, int n = npos) const;

例:

string str = "abc";

str.substr(0, 2);

 

----------------------------------------------------------------------------------------------------------------------

九、字符串连接---增

 

string &operator+=(const string &s);

例:

string str1 = "hello";

string str2 = " world";

string str1 += str2;

 

string &operator+=(const char *s);

例:

string str1 = "hello";

char *ch = " world";

str1 += ch;

 

string &append(const char *s);

例:str.append("xyz");

 

string &append(const char *s, int n);

例:str.append("xyz", 3);

 

string &append(const string &s, int pos, int n);

例:str.append("xyz", 1, 2);


----------------------------------------------------------------------------------------------------------------------

十、string的插入---增

string &insert(int pos, const char *s);

例:

string str = "abcdef";

str.insert(1, "xxx");

 

string &insert(int pos, const string &s);

例:

string str1 = "abcdef";

string str2 = "xxx";

str1.insert(1, str2);

 

string &insert(int pos, int n, char c);

例:

string str("abcdef");

str.insert(1, 3, 'x');


 

----------------------------------------------------------------------------------------------------------------------

十一、string的删除---删

 

string &erase(int pos = 0, int n);

int pos:要删除的起始位置

int n:要删除的个数

例:

string str("abcdef");

str.erase(2, 3);

 

 

----------------------------------------------------------------------------------------------------------------------

十二、string的替换---改

 

string &replace(int pos, int n, const string s)

例:

string str = "abcdef";

str.replace(2, 2, "-----");

 

----------------------------------------------------------------------------------------------------------------------

十三、string的交换---改

 

1. void swap(string &str1, string &str2);

例:

string str1 = "hello";

string str2 = "world";

swap(str1, str2);

 

2.str1.swap(sr2)

例:

string str1 = "hello";

string str2 = "world";

str1.swap(sr2);

 

----------------------------------------------------------------------------------------------------------------------

十四、string的查找---查

 

1.正向查找

int find(char c, int pos = 0) const;//查找字符

例:str.find('c');

 

int find(const char *s, int pos = 0) const;//查找字符串

例:

string str("abcdef");

char *ch = "ef";

str.find(ch, 0);

 

int find(const sring &s, int pos = 0) const;//没找到返回-1

例:

string str1("abcdef");

string str2("de");

str1.find(str2, 0);

 

2.反向查找

int rfind(char c, int pos = npos) const;

例:

string str("abcdefg");

str.rfind('g', str.length()-1);

 

int rfind(const char *s, int pos = npos) const;

例:

string str("abcdef");

str.rfind("ef", str.length() - 1);

 

int rfind(const string &s, int pos = npos) const;

例:

string str("abcdef");

str.rfind("ef", str.length() - 1);

 

----------------------------------------------------------------------------------------------------------------------

十五、stringwstring的转换

1.调用WindowsAPI函数:

WideCharToMultiByte();

MultiByteToWideChar();

例:

//utf-8转unicode
wchar_t *Utf_8ToUnicode(char* szU8) 
{
	//UTF8 to Unicode
	//由于中文直接复制过来会成乱码,编译器有时会报错,故采用16进制形式

	//预转换,得到所需空间的大小
	int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
	
	//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
	wchar_t* wszString = new wchar_t[wcsLen + 1];
	
	//转换
	::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszString, wcsLen);
	
	//最后加上'\0'
	wszString[wcsLen] = '\0';
	return wszString;
}
//unicode转utf-8
char* UnicodeToUTF_8First(CString str)
{   
	int u8Len =WideCharToMultiByte(CP_UTF8, NULL,CStringW(str),str.GetLength(), NULL, 0, NULL, NULL);
	char* szU8 = new  char[u8Len + 1];
	WideCharToMultiByte(CP_UTF8, NULL, CStringW(str), str.GetLength(), szU8, u8Len, NULL, NULL);
	szU8[u8Len] = '\0';
	return szU8;  
}


2.使用ATLCA2W类与CW2A类或使用宏A2WW2A

 

3.跨平台的方法:使用CRT库的mbstowcs()函数和wcstombs()函数,需设定locale.

例:

#include "stdafx.h"
#include <locale>
#include <iostream>
using namespace std;

string ws2s(const wstring &ws)
{
	string curLocale = setlocale(LC_ALL,NULL); //curLocale="C"
	setlocale(LC_ALL, "chs");
	const wchar_t *_Source = ws.c_str();
	size_t _Dsize = 2*ws.size()+1;
	
	char * _Dest = new char[_Dsize];
	memset(_Dest, 0, _Dsize);
	wcstombs(_Dest, _Source, _Dsize);
	
	string result = _Dest;
	
	delete[] _Dest;
	
	setlocale(LC_ALL, curLocale.c_str());
	return result;
}

wstring s2ws(const string &s)
{
	string curLocale = setlocale(LC_ALL, NULL);
	setlocale(LC_ALL, "chs");
	
	const char *_Source = s.c_str();
	size_t _Dsize = s.size() + 1;
	wchar_t *_Dest = new wchar_t[_Dsize];
	wmemset(_Dest, 0, _Dsize);
	mbstowcs(_Dest, _Source, _Dsize);
	wstring result = _Dest;
	
	delete [] _Dest;
	setlocale(LC_ALL, curLocale.c_str());
	
	return	result;
}

int main(int argc, char* argv[])
{
    wstring str1=L"abcdef"; 
	string str2 = ws2s(str1);
	wstring str3 = s2ws(str2);

	wcout<<str1.c_str()<<endl;
	cout<<str2.c_str()<<endl;
	wcout<<str3.c_str()<<endl;

	return 0;
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值