晓石头的博客
邮箱:178673693@qq.com
转载请注明出处,原文链接:http://blog.youkuaiyun.com/qiulanzhu/article/details/50450424
一、string的构造函数
1.默认构造函数
string();
例:string str1;
2.拷贝构造函数
string(const string &str);
例:string str2(sr1);
3.带参构造函数
string(const 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);
----------------------------------------------------------------------------------------------------------------------
十五、string与wstring的转换
1.调用Windows的API函数:
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.使用ATL的CA2W类与CW2A类或使用宏A2W和W2A
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;
}