一.string本质
其实,string并不是一个单独的容器,只是basic_string 模板类的一个typedef 而已,相对应的还有wstring, 你在string 头文件中你会发现下面的代码:
extern "C++" {
typedef basic_string
string;
typedef basic_string
wstring;
} // extern "C++"
二.构造字符串
char allArray[] = "All‘s well that ends well";
string five(allArray, 20);
string six(allArray+6, allArray+10);
原型:string(const char *s, size_type n)
强制从s那里复制n个字符串,如果s的长度小于n,仍然复制无用的字符。
原型:template
string(Iter begin, Iter end)
由于数组名相当于指针,所以allArray+6, allArray+10的类型都是char *,因此使用模板时,将类型char *替换Iter。six初始化为well。
string seven(five+6, five+10); //该语句是错误的,对象名不会被看着对象的地址,five不是指针,而five[6]是个char值,所以&five[6]是一个地址。
string seven(&five[6], &five[10]);
三.string类输入
对于C-风格:
char info[6];
cin.getline(info, 6); //read a line, discard /n
cin.getline(info, 6, ":"); //read up to :,discard :
对于string:
string sbuff;
cin.getline(cin,info); //read a line, discard /n
cin.getline(cin,info, ":"); //read up to :,discard :
它们之间主要区别:string版本的getline将自动调整目标string对象的大小。string对象的最大允许长度,由string::npos指定,这通常是最大unsigned int值。
四.sting类使用
string 提供了非常丰富的查找函数find(find_first_of,find_last_o和substr),insert, replace和erase等函数.
string的c_str()函数是用来得到C语言风格的字符串,其返回的指针不能修改其空间。而且在下一次使用时重新调用获得新的指针。
string的data()函数返回的字符串指针不会以'/0'结束,千万不可忽视。
有这样一个需求:过滤一行开头和结尾的所有非英文字符。看看用string 如何实现:
#include
#include
using namespace std;
int main(){
string strinfo=" //*---Hello Word!......------";
string strset="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
int first = strinfo.find_first_of(strset);
if(first == string::npos) {
cout<<"not find any characters"<
return -1;
}
int last = strinfo.find_last_of(strset);
if(last == string::npos) {
cout<<"not find any characters"<
return -1;
}
cout << strinfo.substr(first, last - first + 1)<
return 0;
}
五.CString,int,string,char*之间的转换
1.string -> CString
CString.format("%s", string.c_str());
2.char -> CString
CString.format("%s", char*);
3.char -> string
string s(char *);
4.string -> char *
char *p = string.c_str();
5.CString -> string
string s(CString.GetBuffer());
6.string -> CString
CString.format("%s", string.c_str());
用c_str()确实比data()要好.
7.char -> string
string s(char *);
你的只能初始化,在不是初始化的地方最好还是用assign().
8.CString -> string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
9.将字符转换为整数,可以使用atoi、_atoi64或atol。
10.CString转换 char[100]
char a[100];
CString str("aaaaaa");
strncpy(a,(LPCTSTR)str,sizeof(a));
六附录
string 函数列表 函数名 描述
begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下,字符串可能的大小
empty 判断是否为空
operator[] 取第几个元素,相当于数组
c_str 取得C风格的const char* 字符串
data 取得字符串内容地址
operator= 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
operator+= += 操作符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
substr 得到字串
compare 比较字符串
operator+ 字符串链接
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入一行