字符串就是内存中存储的一连串字符,C++和C玉缘本身都不支持字符串这种数据类型,但是C语言支持字符数组,简介支持了字符串;而C++标准库带有string类,也简介支持了字符串。C++是C语言的超集,因此,可以认为C++间接支持两种字符串:C风格的字符串和string字符串。由于历史原因,在实际编程时,多数程序员喜欢使用C风格的字符串。
字符集指的是字符串中每个字符在内存中存储时的编码格式,Windows操作系统支持三种编码格式:单字节字符集、多字节字符集和双字节字符集。
单字节字符集(简称SBCS)中每个字符用1字节表示,用于表示英文字符。
多字节字符集(简称MBCS)一般用于亚洲语系。英文字符用1个字节表示,中文用2个字节表示。
双字节字符集(简称DBCS)中的每一个字符都用2字节表示,UNICODE是典型的双字节字符集。每个字符无论中英文都用2个字节存储。
C/C++规定,C风格的字符串就是以字符‘ \0 ’结尾的字符数组。字符‘ \0 ’的ASCII码是数字0,因此也可以将C风格的字符串理解为以数字0结尾的字符数组。在代码中,字符串常量是用双引号括起来的一串字符。
C风格的字符串定义和存储有以下两种形式:
1、使用字符型指针:
eg1:char *str = "你好 C++"; // 多字节字符集
eg2:wchar_t * str2 = L"吃饭了吗?"; // 双字节字符集,前缀加字母L
2、使用字符数组:
eg1:char sName[] = "郭靖"; // 不使用{},多字节字符集
eg2:char sCity[] = {"北京"}; // 使用{},多字节字符集
eg3:wchar_t sAddr [] = {L"黄土高原"}; // 双字节字符集,前缀加字母L
注:上述代码中,sName、sCity和sAddr三个字符串的末尾都有一个数字0,这回占用一个元素的位置,因此在用数组定义和存储字符串时,一定要保证数组的元素个数够用。也可以像上面那样,不指定数组个数,由编译器自动计算。
常用的字符串操作函数:
字符串复制函数:strcpy、wcscpy
字符串连接函数:strcat、wcscat
字符串查找函数:strstr、wcsstr
以上函数中,以w开头的是针对双字节字符集的。另外,在使用以上函数时,需要包含string.h头文件。
示例:
#include <IOSTREAM>
#include <STRING.H> // 包含字符串函数的头文件
using namespace std;
int main (int argc, char* argv[])
{
char str[100] = {"我们都知道"};
char sName[20] = {0};
char sSay[20] = {0};
strcpy(sName, "王立"); // 将字符串“王立”复制到sName中
cout << "sName的内容是:" << sName << endl;
strcat(sSay, "人很好"); // 将字符串“人很好”连接到sSay
cout << "sSay的内容是:" << sSay << endl;
strcat(str, sName); // 将字符串sName连接到str
cout << "str的内容是:" << str << endl;
// 在字符串sName中查找str
// NULL是系统内置的常量,置为0,多用于初始化空指针
if (strstr(str, sName) != NULL)
{
cout << "没错,说的就是" << sName << endl;
}
return 0;
}
运行结果:
sName的内容是:王立
sSay的内容是:人很好
str的内容是:我们都知道王立
没错,说的就是王立