字符串是用双引号括起来的字符序列。比如,“China”。字符串常量会在字符序列末尾添加’\0’作为结尾标记。字符串在内存中按照串中字符的排列顺序存放,并在末尾会添加’\0’作为结尾标记。对于ASCII码来说每个字符占一个字节,而对Unicode码来说每个字符占两个字节。本教程只讲ASCII编码的字符和字符串。
C++和C一样,基本数据类型的变量中没有字符串变量,那怎样处理字符串的存储和操作呢?C语言中用字符数组存放字符串,操作同一般数组类似。C++语言继承了这种方式。除此之外,标准C++库中还定义了string类。
字符数组的声明和使用
字符数组的声明和使用方法和其他类型的数组是一样的。声明字符数组的语法形式为:
char 字符数组名[下标表达式1][下标表达式2]...;
#include <iostream>
using namespace std;
int main()
{
char str[10] = {'I', ' ','l','o','v','e',' ','y','o','u' }; // 声明和初始化一维字符数组str
int i;
for (i=0; i<10; i++)
{
cout << str[i];
}
cout << endl;
return 0;
}
- 字符数组逐个处理数组中的元素,存储的并不是字符串,因为结尾没有结束标记’\0’。
字符串用字符数组存放和处理
在对字符数组进行初始化赋值时,末尾添加了’\0’就构成了字符串,但是用来存放字符串的数组的元素个数应该大于等于字符串的长度加1。为字符数组初始化赋值时,初值可以是用逗号分隔的字符常量或ASCII码,也可以是字符串常量。对于字符串常量,结尾不用显式添加’\0’,'\0’是隐式包含的。
char str[5] = {108,111,118,101,0}; // 以逗号分隔的ASCII码为字符数组初始化赋值
char str[5] = {'l','o','v','e','\0'}; // 以逗号分隔的字符常量为字符数组初始化赋值
char str[5] = "love";
字符串用字符数组存放时,我们可以按照上面的例程中逐个字符处理和输出,还可以将整个字符串一次性输入或者输出。
- 一次性输入:char str[5]; cin >> str;
- 一次性输出:char str[5]=“love”; cout << str;
将字符串一次性输入或输出时我们要注意:
- 对于字符串结尾标记’\0’,输出字符串不会输出。
- 输入多个字符串时需要用空格分隔,若要输入单个字符串则不能有空格,否则会被认为是多个字符串。
- 输出字符串时,输出参数是字符数组名,遇到’\0’时输出结束。
string类
可以使用库中的字符串处理函数来处理字符串,比如,strcat用来连接两个字符串,strcpy用来拷贝字符串,strcmp用来进行字符串的比较,strlen用来计算字符串的长度。使用这些函数之前需要先包含头文件string.h。
string类位于C++标准库中。C++从C语言中继承了一些系统函数,另外又自己定义了一些模板和类,这些模板和类逻辑上分为六种类型:输入/输出类、容器类与ADT(抽象数据类型)、存储管理类、算法、错误处理和运行环境支持。
C++标准库中的类的声明分别处于不同的头文件中,我们要使用这些类时就要包含相应的头文件。但是不同的编译器头文件也不同,VC++ 4.1以前的版本中头文件名的形式为“*.h”,VC++ 4.2版本开始就使用符合ANSI标准的标准C++库,可以在不同的编译器间移植,头文件就不再有.h扩展名了,比如,原来的iostream.h文件的新版本文件名为iostream,但C++标准库还是保留了来自C语言的18个带有.h扩展名的头文件。我们在软件开发中,可以使用以前的带有.h扩展名的头文件也可以使用新版本的头文件,编译器会自动判断链接哪一个库。但是注意,不能两种文件混着包含,比如,包含了头文件iostream.h,又包含了新版本头文件string,这种情况是不允许的。
在包含了标准C++库中不带.h扩展名的头文件后,必须加入指定名字空间的语句。例如:
#include // 包含iostream头文件
using namespace std; // 指定名字空间std
string类封装了字符串的属性和操作,这些属性包括:字符序列、字符序列的长度、一个字符的大小等等,还提供了一些对字符串的操作:查找、分配、连接和追加等。
string类的构造函数
string(); // 默认构造函数,创建一个长度为0的字符串
string(const string &ths); // 拷贝构造函数
string(const string &ths, unsigned int pos, unsigned int n); // 从字符串ths的位置pos(第pos+1个字符)开始取n个字符,用来初始化string类的对象。提示:第i个字符的位置为i-1
string(const char *s, unsigned int n); // 用指针s指向的字符串中的前n个字符初始化string类的对象
string(unsigned int n, char c); // 用n个重复的字符c来初始化string类的对象
string类的一些常用成员函数
称成员函数所属对象为“本对象”,其中存放的字符串为“本字符串”。
string append(const char *s); // 将指针s指向的字符串添加到本字符串尾
string assign(const char *s); // 讲指针s指向的字符串赋值给本对象
string& insert(unsigned int p0, const char *s); // 讲s指向的字符串插入到本字符串的位置p0之前
string substr(unsigned int pos, unsigned int n) const; // 从本字符串的位置pos开始取n个字符构成新的字符串对象返回
unsigned int find(const basic_string &str) const; // 在本字符串中查找str并返回第一次出现的位置
unsigned int length() const; // 返回本字符串的长度
void swap(string &str); // 交换本字符串与str的内容
int compare(const string &str) const; // 比较本字符串与字符串str的大小。若两个字符串相等则返回0,若本字符串小于str,则返回负数,若本字符串大于str,则返回正数。
string类的操作符
| 操作符 | 举例 | 备注 |
|---|---|---|
| +‘ | str1+str2 | 将字符串str1和str2连接成一个字符串 |
| = | str1=str2 | 将str2赋值给str1 |
| += | str1+=str2 | 相当于str1=str1+str2 |
| == | str1==str2 | 判断str1与str2是否相等 |
| != | str1!=str2 | 判断str1与str2是否不相等 |
| < | str1 <= str1<=str2 | 判断str1是否小于等于str2 |
| ‘ > | str1>str2 | 判断str1是否大于str2 |
| ’>= | str1>=str2 | 判断str1是否大于等于str2 [] |
MFC中还有CString类。

1407

被折叠的 条评论
为什么被折叠?



