一.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 从输入流中读入一行