第四章 复合类型(1)

来源:互联网 发布:医院三乙复评应知资料 编辑:程序博客网 时间:2024/05/17 01:05

C++ primer plus前三章太基础了,我这就偷偷懒直接跳过了,直接从第四章开始。

1.数组

数组是啥也不说了,C++声明数组通用格式

typeName arrayName[arraySize];

e.g float loans[20];

typeName就是数组里面的元素的类型,可以是int啊,double啊,或者class都行。一般来说arraySize必须是固定值,但也可以通过创建动态数组来避开这个规则。


访问每个元素:loans[0], loans[1], loans[2]....(从零开始!)

注意:编译器不会坚持使用的下边是否有效,例如要使用loans[100]就不会报错,但程序运行会发生什么就不好说了。。。


数组的初始化规则:好几种,直接举例了:

int cards[4] = {3, 6, 8, 10};

int hand[4];

float hotelTips[5] = {5.0, 2.5}; // 剩余元素会被编译器设为0

short things[] = {1, 5, 3, 8}; //编译器会自己计算元素个数

错误类型:

hand[4] = {5, 6, 7, 9};

hand = cards;


c++ 11 新增了几种数组初始化的功能,但现在还在入门阶段,未免混淆,就不提了。


2. 字符串

字符串是最头疼的了,因为C++有两种处理字符串的方式,第一种来自C,叫做C风格的字符串,第二章是基于C++ string类库的方法。

C风格把字符串储存在char 的数组中,而且必须以空字符(‘\0')结尾!,不然就是普通的char数组。。。。

char dog[8] = {'b', 'e', 'a', 'u', 'x', ' ', 'I', 'i'}; 这只是一个char数组,不是字符串

char cat[8] ={'f', 'a', 't', 'e', 's', 's', 'a', '\0'}; 这就是一个字符串。


还好C++不是那么灭绝人性,要一个一个打输入,也可以这样

char bird[11] = "Mr. Cheeps";

或者char fish[] = "bubbles";

这个时候,编译器会自动把数组最后一个元素设为’\0‘

上例中

char bird[11] = {'M", 'r', '.', ' ', 'C', 'h', 'e', 'e', 'p', 's', ’\0‘};


这个时候就要注意一下两个赋值语句的区别了:

char size = 'S'; // 一个char

char size[] = "S";//一个char数组,包含两个元素’S',和’\0‘;


字符串要么通过代码初始化,要么就通过键盘输入(或者从文件中读取),下面就总结一下键盘输入的方法(通过cin)

要允许键盘输入,肯定得include <iostream>了,这个时候还得用using namespace std. 这就是名称空间里,具体第九章会讲。

先声明一个字符串,然后在通过cin读入,之后怎么用就是都行了

e.g.

char name[15]; //声明这个字符串

cin>>name;

这个时候输入的就赋给name这个字符串来。但是这仅限于输入的是一个单词,没有空格!

这是因为:cin使用空白(空格,制表符和换行符)来确定字符串的结束位置,这意味着字符数组输入时只读取一个单词;如果空格之后还有一个单词,那第二个单词就会留在队列中,赋给下一个字符串 (具体看程序清单4.3 instr1.cpp)。另外要是输入name时候输入的多余15个字符有咋办嘞。

c++肯定想到这个问题了,解决方法就是cin的成员函数:getline()和get();

getline()函数读取正酣,只通过回车键输入的换行符来确定输入结尾。上例中可以通过这样的方式给name赋值:

cin.getline(name,15),//15表示这个函数最多读取15-1=14个字符;要是没到14个,余下的空间用于存储自动在结尾处添加到空字符。

注意getline通过换行符来确定行尾,但不保存换行符。


另外一个方法是get(), 用法和getline()差不多,区别是get()保留换行符在队列中,所以下次调用的时候回读取队列中上次留下来的换行符。要给两个字符串赋值,必须得这样:

cin.get(name1, 15);

cin.get()l

cin.get(name2, 15);

或者cin.get(name1, 15).get();

cin.get(name2, 15).get();


那么get()相比getline()有什么好处呢:如果用get()将一行读入数组中,如何知道停止读取的原因是由于已经读取了整行还是由于数组已填满呢?查看下一个输入字符,如果是换行符,说明已读取了整行,否则就是该行还有其他输入。


此外,使用get()时读取空行后将会将接下来的输入阻断,但可以用下面的命令来恢复输入:

cin.clear();

而使用getline()读取空行时,吓一跳输入语句将在前一条getline()结束的位置开始读取


cin,cin.getline(), cin.get()绝对是给初学者的一个下马威,他们之间的区别和具体用法网上介绍很多,大家就自行搜索理解了

0 0