C++ 字符串
C++ 字符串
C++ 提供了以下两种类型的字符串表示形式:
C 风格字符串
C++ 引入的 string 类类型(string class type)
C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串指针。
一、C 风格字符串
C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 "Hello" 的字符数多一个。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
依据数组初始化规则,您可以把上面的语句写成以下语句:
char greeting[] = "Hello";
以下是 C/C++ 中定义的字符串的内存表示示意:
C/C++ 中的字符串表示
其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 '\0' 放在字符串的末尾。
输出上面的字符串的代码:
#include <iostream>
using namespace std;
int main ()
{
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout << greeting << endl;
return 0;
}
运行之,参见下图:
C风格字符串将字符串放在字符数组中,并以空字符'\0'结束,一般利用指针来操作这些字符串。尽管C++支持C风格字符串,但建议在C++程序中尽量不要使用它们。一些用于操作C风格字符串的标准库函数定义在cstring头文件中,是C语言头文件string.h的C++版本。
1)字符串复制函数:
char *strcpy(char *s,const char ct)
返回值是指向复制后字符串中首字符的指针。。
例子
#include <iostream>
//#include <string.h>
#include <cstring>
using namespace std;
int main ()
{
char str[] = "just test";
char des[20];
//cout << strcpy(des, str)<< endl; //本句和下面两句效果相同,但下面两句更直观说明 strcpy()的含义
strcpy(des, str);
cout << des<< endl;
return 0;
}
运行值,参见下图:
2)字符串连接函数:char *strcat(char *s,const char *ct)
将串ct复制到串s的后面,形成一个长串。例如:
#include <iostream>
//#include <string.h>
#include <cstring>
using namespace std;
int main ()
{
char str1[]="李小明";
char str2[]="是大学生";
//cout << strcat(str1,str2)<< endl; //本句和下面两句效果相同
strcat(str1,str2);
cout <<str1<< endl;
return 0;
}
运行值,参见下图:
3)字符串比较函数:int strcmp(const char *cs,const char ct)。
两字符串比较是按字典排序方法进行。两个字符串从第一个字符比较起,如果相同,则比较第二个字符,依此类推,直到不同。哪个字符串对应的字符的ASCII码值大,串就大。如果两串直到结束符都相同,则一样大。若两个字符串相等,则返回0;串cs大,则返回正整数;串ct大,则返回负整数。
例
#include <iostream>
//#include <string.h>
#include <cstring>
using namespace std;
int main ()
{
char strA[] = "Hello world";
char strB[] = "Hello, world";
cout << strcmp(strA, strB)<< endl;
return 0;
}
运行值,参见下图:
4)求字符串长度函数:int strlen(const char *s)
这里求出的串长度不包含串结束符在内。而sizeof运算符包括结束符,还包括没有使用的单元。
#include <iostream>
//#include <string.h>
#include <cstring>
using namespace std;
int main ()
{
char str[] = "Hello world";
cout << strlen(str) << endl;
return 0;
}
运行值,参见下图:
二、C++ 中的 String 类
使用 string 类需要包含头文件<string>
C++ 标准库提供了 string 类类型(string class type),支持上述所有的操作,另外还增加了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:
现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。所以现在您可以只是粗略地看下这个实例,等理解了面向对象的概念之后再回头来理解这个实例。
例
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1 = "Hello";
string str2 = "World";
string str3;
int len ;
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
运行之,参见下图:
定义 string 变量(对象)的方法:
string s1;
string s2 = "c plus plus";
string s3 = s2;
string s4 (5, 's');
变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。
变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志'\0'。
变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。string 变量也可以用C风格的字符串进行赋值。
变量 s4 被初始化为由 5 个's'字符组成的字符串,也就是"sssss"。
当我们需要知道字符串长度时,可以调用 string 类提供的 length() 函数。如
string s = "http://c.biancheng.net";
int len = s.length(); //结果为22。string 的末尾没有'\0'字符,所以 length() 返回的是字符串的真实长度,而不是长度 +1。
,string 类为我们提供了一个转换函数 c_str(),该函数能够将 string 字符串转换为C风格的字符串,并返回该字符串的 const 指针(const char*)。例如
string path = "D:\\demo.txt";
path.c_str()
string 字符串的输入输出
string 类重载了输入输出运算符,可以像对待普通变量那样对待 string 变量,也就是用>>进行输入,用<<进行输出。
#include <iostream>
#include <string>
using namespace std;
int main(){
string s;
cin>>s; //输入字符串
cout<<s<<endl; //输出字符串
return 0;
}
下面介绍对字符串的操作。
访问字符串中的字符的例:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s = "abcDEF1234";
for(int i=0,len=s.length(); i<len; i++){
cout<<s[i]<<" ";
}
cout<<endl;
s[4] = '6';
cout<<s<<endl;
return 0;
}
运行之,参见下图: