c也有string关键字,但是作用很有限,因为它只能表示字符串常量。
c++中 string 功能就强大许多,完全可以代替字符数组的作用。
1.使用string需要加入头文件<string>
2.下面的例子介绍了几种定义 string 变量(对象)的方法:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s1;//只是定义但并未初始化
string s2 = "c plus plus";//定义+初始化
string s3 = s2;//变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"
string s4 (5, 's');//被初始化为5个's'组成的字符串,也就是"sssss"
return 0;
}
3.与c风格字符串不同,我们可以用s.length()等函数
4.把string转化为c风格字符串
虽然 C++ 提供了 string 类来替代C语言中的字符串,但是在实际编程中,有时候必须要使用C风格的字符串(例如打开文件时的路径),为此,string 类为我们提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)。请看下面的代码:
string path = "D:\\demo.txt"; FILE *fp = fopen(path.c_str(), "rt");
为了使用C语言中的 fopen() 函数打开文件,必须将 string 字符串转换为C风格的字符串。
5.字符串的拼接
有了 string 类,我们可以使用+
或+=
运算符来直接拼接字符串,非常方便,再也不需要使用C语言中的 strcat()、strcpy()、malloc() 等函数来拼接字符串了,再也不用担心空间不够会溢出了。
6. 插入字符串
insert() 函数可以在 string 字符串中指定的位置插入另一个字符串,它的一种原型为:
string& insert (size_t pos, const string& str);
pos 表示要插入的位置,也就是下标;str 表示要插入的字符串,它可以是 string 字符串,也可以是C风格的字符串。
#include <iostream> #include <string> using namespace std; int main(){ string s1, s2, s3; s1 = s2 = "1234567890"; s3 = "aaa"; s1.insert(5, s3); cout<< s1 <<endl; s2.insert(5, "bbb"); cout<< s2 <<endl; return 0; }
运行结果:
s1:12345aaa67890 s2:12345bbb67890
7.删除字符串
erase() 函数可以删除 string 中的一个子字符串。它的一种原型为:
string& erase (size_t pos = 0, size_t len = npos);
pos 表示要删除的子字符串的起始下标,len 表示要删除子字符串的长度。如果不指明 len 的话,那么直接删除从 pos 到字符串结束处的所有字符(此时 len = str.length - pos)。
8. 提取子字符串
substr() 函数用于从 string 字符串中提取子字符串,它的原型为:
string substr (size_t pos = 0, size_t len = npos) const;
pos 为要提取的子字符串的起始下标,len 为要提取的子字符串的长度。
#include <iostream> #include <string> using namespace std; int main(){ string s1 = "first second third"; string s2; s2 = s1.substr(6, 6); cout<< s1 <<endl; cout<< s2 <<endl; return 0; }
运行结果:
first second third
second
四. 字符串查找
string 类提供了几个与字符串查找有关的函数,如下所示。
1) find() 函数
find() 函数用于在 string 字符串中查找子字符串出现的位置,它其中的两种原型为:
size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
第一个参数为待查找的子字符串,它可以是 string 字符串,也可以是C风格的字符串。第二个参数为开始查找的位置(下标);如果不指明,则从第0个字符开始查找。
请看下面的代码:
#include <iostream> #include <string> using namespace std; int main(){ string s1 = "first second third"; string s2 = "second"; int index = s1.find(s2,5); if(index < s1.length()) cout<<"Found at index : "<< index <<endl; else cout<<"Not found"<<endl; return 0; }
运行结果:
Found at index : 6
find() 函数最终返回的是子字符串第一次出现在字符串中的起始下标。本例最终是在下标6处找到了 s2 字符串。如果没有查找到子字符串,那么会返回一个无穷大值 4294967295。