除了科学计算外,计算机最主要的用途是文字处理。有一系列字符组成的一个处理单元称为字符串,C++中的字符串是用一对双引号括起来、由'\0'作为结束符的一组字符。
1.字符串存储
字符串符合数组的两个特性:所有元素类型都是字符型,字符串中的字符有先后的次序,所以通常用一个字符数组来存储字符串。如将“hello,world!”这个字符存储在字符数组中:
char ch={'h','e','l','l','o',',','w','o','r','l','d'};
注意末尾要加一个'\0',数组长度是字符串长度再加1.
或者
char ch={"hello,world"};
或者
char ch="hello,world";
注意:
1.不包含任何字符的字符串称为空字符串。空字符串用一对双引号表示,即“”。空字符串占一个字节的空间,这个字节中存放的是一个'\0'.
2.在C++中,'a'和“a”是不一样的,前者表示一个字符常量,在内存中占1个字节,里边存放字符a的内码值,后者是一个字符串,用一个字符数组存储,它占2个字节空间,第一个字节存放字母a的内码值,第二个字节存放'\0'.
2.字符串的输入/输出
三种方法
- 逐个字符的输入输出,与操作数组一样
- 将整个字符串一次性地用对象cin和cout的>>和<<操作完成输入或输出。
- 通过cin的成员函数getline输入。
如定义一个字符数组ch,要输入一个字符串放在ch中,可以直接:
cin>>ch;
如上操作将导致键盘输入的字符依次存放在ch数组中,直到读入一个空白字符为止。要输出ch的内容可以用:
cout<<ch;
这时,ch数组中的字符依次被显示在显示器上,直到遇见'\0'.
注意:使用>>输入字符串时不能输入空白字符,即不能包含如空格、回车、Tab键。使用>>输入字符串不能控制输入的字符串长度,在用键盘输入过程中,不会检查输入的字符个数是否超过了数组长度。输入字符个数超过数组长度,就会占用不属于该数组的空间,这种现象就是内存溢出。内存溢出会导致一些无法预知的错误。所以使用>>输入字符串时,最好设置一些提示信息告知允许的最长字符串长度。
数组不能直接用cin和cout对象输入输出。数组的输入输出是通过输入输出它的每一个元素实现的。但当用一个字符数组存储一个字符串时是特例!,字符数组能直接输入输出。用>>输入一个字符串时,必须注意空白字符和内存溢出。
使用cin的成员函数getline实现:
cin.getline(字符数组,数组长度,结束标记);
它从键盘接受一个包含任意字符的字符串,直到遇见了指定的“结束标记”或达到了数组长度减1。支持输入空白字符 如空格、回车、Tab键等操作。结束标记可以 不设定,此时默认回车为结束标记。如:
char ch1[80];
char ch2[90];
cin.getline(ch1,80,'.');
cin.getline(ch2,90);
例1.统计一行文字中有多少个单词,单词与单词之间是用空格隔开(即‘’)。
//统计一段文字中的单词个数
#include <iostream>
using namespace std;
int main()
{
const int LEN = 80;
char sentence[LEN+1], prev = ' '; //prev 表示当前字符的前一字符
int i, num = 0;
cin.getline(sentence, LEN+1);
for (i = 0; sentence[i] != '\0'; ++i) {
if (prev == ' ' && sentence[i] != ' ') ++num;
prev = sentence[i];
}
cout << "单词个数为:" << num << endl;
return 0;
}
3.字符串处理函数
常见的有:复制、拼接、比较等。字符串是以数组的形式存储,所以不能用ch1=ch2,也不能用ch1>ch2这种系统内置运算符操作。
字符串赋值必须有一个循环来完成对应元素之间的赋值。字符串的比较也是通过比较 两个字符数组的对应元素实现。c语言提供了处理字符串的函数库cstring,C++也可以使用这些函数。
strcpy(dst,src) | 将字符串从src复制到dst。函数返回值是dst的地址 |
---|---|
strncpy(dst,src,n) | 至多从src复制n个字符到dst。函数返回值是dst的地址 |
strcat(dst,src) | 将src拼接到dst后,函数返回值是dst的地址 |
strncat(dst,src,n) | 从src至多取n个字符拼接到dst后。函数返回值是dst的地址 |
strlen(s) | 返回字符串s的长度,即字符串中字符个数(不包括'\0') |
strcmp(s1,s2) | 比较s1和s2。如果s1>s2,返回值为正,s1=s2返回值为0,s1<s2返回值为负数 |
strncmp(s1,s2,n) | 与strcmp类型,这是至多比较n个字符。 |
strchr(s,ch) | 返回一个指向s中第一次出现ch字符的地址。 |
strrchr(s,ch) | 返回一个指向s中最后一次出现ch字符的地址。 |
strstr(s1,s2) | 返回一个指向s1中第一次出现s2的地址 |