C++中string是标准库中一种容器,相当于保存元素类型为char的vector容器(自己理解),这个类提供了相当丰富的函数来完成对字符串操作,以及与C风格字符串之间转换,下面是对string一些总结<引用>
一,C语言的字符串
在C语言里,对字符串的处理一项都是一件比较痛苦的事情,因为通常在实现字符串的操作的时候都会用到最不容易驾驭的类型——指针。
比如下面这个例子:
//example 1:
char str[12] = "Hello";
char *p = str;
*p = 'h'; //改变第一个字母
//example 2:
char *ptr = "Hello";
*ptr = 'h'; //错误
第一个字符串时用数组开辟的,它是可以改变的变量。而第二个字符串则是一个常量,也就是字面值。ptr只是指向它的指针而已,而不能改变指向的内容。
看两者的汇编即可明了:
char p[] = "Hello";
004114B8 mov eax,dword ptr [string "Hello" (4166FCh)]
004114BD mov dword ptr [ebp-10h],eax
004114C0 mov cx,word ptr ds:[416700h]
004114C7 mov word ptr [ebp-0Ch],cx
char *ptr = "Hello";
004114CB mov dword ptr [ebp-1Ch],offset string "Hello" (4166FCh)
可见用数组和用指针是完全不相同的。
要想通过指针来改变常量是错误,正确的写法应该是用const指针。
const char *ptr = "Hello";
二,初识string类
正是因为C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。注意<string.h>和<cstring>都是错误的,这两个头文件主要定义C风格字符串操作的一些方法,譬如strlen(), strcpy()等。第一个是C的头文件格式,而第二个是C++风格的头文件,但是和<string.h>是一样的,它的目的是为了和C兼容。
看下面例子:
//example 3:
string str("world"); //可以用C风格字符串初始化
string words = "Hello";
string greet = words;
string join = greet + words; //可以像基本类型一样操作
但是如果试图把string类型的对象直接赋给C风格的字符串的话,编译器会报错的。
string var = "Olympic";
char *ptr = var; //error!
但是实际应用中这个问题也难以避免,很多时候我们还是需要将string类型的转化为char*来实现自定义的操作,C++标准库也为了和之前用C写的程序兼容,于是可以用string的c_str()函数。
string var = "Olympic";
char *ptr = var.c_str(); //还不能被编译
但是c_str()为了防止意外地修改string对象,返回的是const指针,所以上面这段代码是不能被编译的。正确的应该是用const指针。
string var = "Olympic";
const char *p = var.c_str(); //Correct!
这个c_str()方法在C++IO流操作上也被广泛应用。
在打开文件时,如果要指定文件名,可以用C风格的字符串。如果用到string类型的字符串作为文件名时,就必须调用c_str()方法将其转换为一个C风格字符串。
//example 4:
string filename; //定义文件名称
cin >> filename;
ifstream.open(filename.c_str()); //要使用C风格字符串
#include <string> // 使用 string 类时须包含这个文件
#include <iostream>
using namespace std;
int main()
{
string str1;
// 输入与输出
cout << "输入字符串 str1" << endl;
cin >> str1; getchar();
cout << str1 << endl << endl << endl;
// 一行行读取
cout << "输入字符串 str1" << endl;
getline( cin, str1 );
cout << str1 << endl;
// 与 c字符转换
string str2("Hello World!"), str3;
char str4[50];
cout << "输入 C 字符串" << endl;
scanf("%s",str4);
str3= str4;
cout << "str2 is " << str2 << endl;
cout << "str3 is " << str3 << endl << endl << endl;
// 求字符串的长度
string str5;
cout << "输入字符串 str5" << endl;
cin >> str5;
int len= str5.size();
cout << "字符串 str5的长度为" << len << endl << endl << endl;
// 遍历字符串例子
string str6;
cout << "输入字符串 str6" << endl;
cin >> str6;
int i;
for( i= 0; i< str6.size(); ++i )
cout << str6[i];
cout << endl << endl;
// 比较两个字符串 比较规则同 c字符串比较规则
string str7, str8;
cout << "输入字符串 str7, str8 , 中间用空格格开" << endl;
cin >> str7 >> str8;
if( str7< str8 ) cout << str7 << " 小于 " << str8 << endl;
else if( str7> str8 ) cout << str7 << " 大于 " << str8 << endl;
else cout << str7 << " 等于 " << str8 << endl;
// 字符串与字符相加
string str9= "Darren";
char ch1= 'a', ch2= 'b';
str9= str9+ ch1; cout << str9 << endl << endl;
str9= ch2+ str9; cout << str9 << endl << endl << endl;
// 字符串与字符串相加
string str10= "Acm", str11= "ICPC";
str10.append( str11 );
cout << str10 << endl << endl;
// 字符串是否包含子串 如果包含 则返回子串在目标串中第一次出现的位置
string str12= "I am a student", str13= "student", str14= "aaaaaaa";
if( str12.find( str13 )!= -1 ) cout << "Find " << str13 << endl;
if( str12.find( str14 )== -1 ) cout << "Not Find " << str14 << endl;
// 转换成 c_字符串
string str15= "Hello World";
printf("%s\n", str15.c_str() );
system("pause");
return 0;
}
1 #include <string> 2 #include <iostream> 3 4 int main() 5 { 6 std::string a = "0123456789abcdefghij"; 7 8 std::string sub1 = a.substr(10); 9 std::cout << sub1 << '\n'; 10 11 std::string sub2 = a.substr(5, 3); 12 std::cout << sub2 << '\n'; 13 14 std::string sub3 = a.substr(12, 100); 15 std::cout << sub3 << '\n'; 16 }
Output:
1 abcdefghij 2 567 3 cdefghij