上一讲鸡啄米讲了动态内存分配和释放的内容,今天要讲的是字符串,是编程入门必须要掌握牢的内容之一。
在编程系列之四(数据类型)中鸡啄米说过,字符串是用双引号括起来的字符序列。比如,"China"。字符串常量会在字符序列末尾添加'\0'作为结尾标记。字符串在内存中按照串中字符的排列顺序存放,并在末尾会添加'\0'作为结尾标记。对于ASCII码来说每个字符占一个字节,而对Unicode码来说每个字符占两个字节。本教程只讲ASCII编码的字符和字符串。
C++和C一样,基本数据类型的变量中没有字符串变量,那怎样处理字符串的存储和操作呢?C语言中用字符数组存放字符串,操作同一般数组类似。C++语言继承了这种方式。除此之外,标准C++库中还定义了string类。这一讲主要说下怎样通过字符数组的方式存储和操作字符串,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; }
程序运行结果:
I love you
二.字符串用字符数组存放和处理
上面的例子中定义了字符数组并逐个处理数组中的元素,但存储的并不是字符串,因为结尾没有结束标记'\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;
将字符串一次性输入或输出时我们要注意:1.对于字符串结尾标记'\0',输出字符串不会输出。2.输入多个字符串时需要用空格分隔,若要输入单个字符串则不能有空格,否则会被认为是多个字符串。3.输出字符串时,输出参数是字符数组名,遇到'\0'时输出结束。
鸡啄米举例说明下以上三点:
1.char str[5]="love"; cout << str;。字符串"love"的结尾隐含'\0',输出时只会输出"love"而不会输出'\0'。
2.char str1[5],str2[5],str3[5]; cin >> str1 >> str2 >> str3;程序执行时输入"I love you",则字符串str1、str2和str3分别被赋值"I"、"love"和"you"。如果改为char str[11]; cin >> str;程序执行时输入"I love you",则str被赋值为"I"。因为'I'后输入了空格,被认为是多个字符串,str只用空格前的子字符串赋值。
3.输出字符串时cout参数只写字符数组名就可以了,比如cout << str就可以输出str字符串,遇到'\0'时输出结束。
我们可以使用库中的字符串处理函数来处理字符串,比如,strcat用来连接两个字符串,strcpy用来拷贝字符串,strcmp用来进行字符串的比较,strlen用来计算字符串的长度。使用这些函数之前需要先包含头文件string.h。至于这些函数的详细说明和用法可以在vs2010的msdn中查询。
鸡啄米今天就讲到这里了,主要讲了用字符数组存储和操作字符串的方法,下一讲再讲标准C++库中的string类。大家有问题可以来鸡啄米博客留言交流。