您的位置:首页 > 编程语言 > C语言/C++

C++ 初学者指南 第四篇(5)

2010-05-19 16:03 246 查看
必备技能 4.4: 字符串
到目前为止,一维数组最常用的就是用来创建字符串。C++支持两种类型的字符串。第一种,也是最常用的一种,就是以0结束的字符串,它是一个一维数组,其中用0表示字符串结束。因此,一个以0结束的字符串包含了组成这个字符串的字符和紧跟在最后面的0(字符’/0’)。这种以0结束的字符串由于提供了很高的效率和对字符串的详细操作而得到广泛的使用。当C++程序员在谈论到字符串的时候,他(她)通常指的就是这种以0结束的字符串。第二种字符串指的是C++中定义的字符串类,它是C++类库中的一部分。所以,字符串不是C++内置的数据类型。虽然字符串类提供了面向对象的字符串处理方法,但是它的是使用没有以0结束的字符串的使用广泛。这里我们只研究以0结束的字符串。
字符串的基本知识
当使用数组来定义以0结束的字符串的时候,数组的大小需要比字符串中字符的数量大1。例如,如果我们想定义一个数组表示的字符串,它含有10个字符,那么应该这样写:
char str[11];
之所以定义数组的大小是11而不是10是为了给字符串的末尾的0保留空间。正如在前面学习到的那样,C++运行程序员定义字符串常量。一个字符串常量就是用双引号引起来的字符的序列。下面是一些示例:
“hello there” “I like C++” “Mars” “”
在定义字符串常量的时候不需要手工在字符串的末尾添加结束标记0。这个有C++编译器来完成。因此,字符串”Mars”在内存中的存储情况如下:

M
a
r
s
0
上面示例的最后一个字符串为“”。这种字符串被称为空字符串。它只包含了字符串的结束标识,并没有其它的字符。空字符串是有用的,它代表的是一个不含有任何字符的字符串。
从键盘读取一个字符串
从键盘读取一个字符串的最简单的方式就是使用cin语句和字符数组。例如,下面的程序读入一个用户输入的字符串:
#include <iostream>
using namespace std;

int main ()
{
char str[90];

cout << "Enter a string:";
cin >> str ; //使用cin从键盘读入一个字符串

cout << "Here is your string:";
cout << str;

return 0;
}

程序运行的结果可能如下:
Enter a string:testing
Here is your string:testing
尽管上面的程序从技术上来讲是正确的,但是它并不总是能按照我们的预期来工作。为了明确为什么,我们可以再次运行这个程序,键入字符串“This is a test”。看到的结果如下:
Enter a string:This is a test
Here is your string:This
当程序输出字符串的时候,只是输出了“This”,而不是整个句子。这是因为C++中的输入输出系统在读取字符串的时会在遇到第一个空白的时候就停止。空白可以是空格,制表符和换行符。
一个用于解决空白带来的问题的方法就是使用C++的库函数gets()。gets()的常用的使用方法如下:
gets(数组名);
在读取字符串的时候,调用gets()方法,传入一个数组名作为参数,不用传入任何索引。gets()函数调用结束后,指定的数组中就包含了从键盘读入的字符串。gets()函数会一直读取字符,包括空白,直到用户键入一个回车键。使用这个函数,需要引入头文件<cstdio>。
用gets()方法获取含有空格的字符串,重写上面的程序如下:
#include <iostream>
#include <cstdio>
using namespace std;

int main ()
{
char str[90];

cout << "Enter a string:";
gets(str) ; //使用cin从键盘读入一个字符串

cout << "Here is your string:";
cout << str;

return 0;
}
输出结果如下:
Enter a string:This is a test
Here is your string:This is a test
从上面的结果中可以看出,空格也被读入到了字符串中。还有一点需要注意,就是在cout语句中直接使用了str。通常,用于存储字符串的字符数组的名字可以出现在任何字符串常量可以出现的地方。
必须注意:cin和gets()都不对数组的边界进行检查。因此,如果用户键入的字符串的长度大于了数组的大小,就会造成写数组越界。在后面的章节,我们会学习到另外的可以避免这种情况发生的方法。

练习
1. 什么是null-terminated字符串?
2. 为了存储一个含有8个字符的字符串,字符数组的大小应该是多少?
3. 使用什么样的函数可以从键盘读取到含有空格的字符串?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: