string是模板,是被typedef出来的类型。
存在两种字符串:string和wstring(宽字符串,unicode)
typedef basic_string<char, char_traits<char>, allocator<char>> string;
typedef basic_string<wchar, char_traits<wchar>, allocator<wchar>> wstring;这个不常使用
实例代码
#include "string"
#include "stdio.h"
#include "iostream"
using namespace std;
void test(const string& t){} //传地址,不可修改
void test(string& t){} //传地址,可以修改
void test(string t){} //这种方式一般不用,直接传值不好,一般使用上面2种方式
int main()
{
//字符串初始化
string str1("Liming");
const char* str1_1 = (char*)str1.c_str();
cout << str1_1 << endl;
cout << str1 << endl;
string str2 = "Lina";
cout << str2 << endl;
string str3("abcde", 3); //取字符串中的前三个字符
cout << str3 << endl;
string str4;
cout << str4 << endl;
string str5 = "";
cout << str5 << endl;
//string str6 = NULL;
//将字符串转换成char*类型
string text("hello, world!\n");
const char* p = text.c_str();
printf("str: %s \n", text.c_str());
//字符串追加
string t1;
t1.append("nancy");
t1.append("nick", 2); //取字符串中的前3个字符,输出为nic
t1.append("jack", 1, 3); //取字符串中的第1到第2个字符,一共2个字符
t1.append(2, 'h'); //将字符复制2遍加在后面,一定只能是字符,不能是字符串,也就是只能是单引号
cout << t1 << endl;
//重载了左值
string t3 = "hello";
t3[1] = 'i';
t3.at(2) = 'p';
cout << t3 << endl;
//字符串比较
string t4 = "OK";
if(t4 == "OK")
{
printf("equal \n");
}
//字符串查找
string t5 = "Liming is doing homework";
int p1 = t5.find("i");
int p2 = t5.rfind("e");
cout << "p1:" << p1 << "\n" << endl; //从左开始查找,返回索引值1
cout << "p2:" << p2 << "\n" << endl; //从右开始查找,返回索引值19
//截取子字符串
string t6("abcdefg");
string r1 = t6.substr(4); //从第4个字符开始一直到最后
string r2 = t6.substr(4,2); //从第4个字符开始,取2个字符
cout << "r1:" << r1 << endl;
cout << "r2:" << r2 << endl;
printf("end");
return 0;
}
输出结果为
碰到问题:
(1)有时cout不能输出string?
先来看CString、string和string.h这几个区别
CSting:CString是MFC或者ATL中的实现,是MFC里面封装的一个关于字符串处理的功能很强大的类,只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的string类了。在MFC中使用不需要自己加,但在另外的程序中需要加入#include<CString>。
string:string类既是一个标准c++的类库,同时也是STL(Standard Template Library,标准模版库)中的类库,已经纳入C++标准之中。它和CString有本质的区别。
string.h:C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,这个头文件跟C++的string类半点关系也没有,所以 <string>并非 <string.h>的“升级版本”,他们是毫无关系的两个头文件。
综上,cout函数重载的是string类库中的string类型,而不是CString或string.h中的。
可以将字符串转成char*类型,然后使用cout输出;也可以直接输出,cout是兼容string中的string类型的。