《C++ Primer Plus》读书笔记之二—复合类型

二、第四章 复合类型 

  1、C-风格字符串:C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写成 ,其ASC||编码为0,用来标记字符串的结尾。例如:

char dog[5]={'b','e','a','u','x'}; // not a string!

char cat[5]={'f','a','t','s',' '};  // a string!

这两个数组都是char数组,但只有第二个数组是字符串。空字符串对C-风格字符串至关重要。如果使用coiut显示上面的cat这样的字符串,将显示前四个字符,发现空字符后停止。但是如果要显示dog数组(它不是字符串),cout将打印出数组的5个字符串,并接着将内存中随后的各个字节解释为要打印的字符,直到遇到空字符为止。

  另外一种将字符数组初始化为字符串的方法,这种字符串被称为字符串常量:

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

char fish[]="Bubbles";

用引号括起的字符串隐式的包含结尾的空字符,因此不用显示的包括它。

注意:在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内。

  2、每次读取一行字符串输入:istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。

①面向行的输入:getline():使用方法:cin.getline(arryName,size),arryName时用来存储输入行的数组的名称,size是要读取的字符数。getline()成员函数在读取指定数目的字符或者遇到换行符时停止读取。

②面向行的输入:get():该函数有几种变体(函数重载),get()将换行符保留在输入序列中。如果需要两次cin输入,则正确的用法是:

cin.get(name1,size1);

cin.get();  // or cin.get(ch)读取一个换行符

cin.get(name2,size2);

另外一种使用这两个函数的方法是:

cin.get(name1,size1).get();

cin.getline(arryName,size).getline(name2,size2);之所以可以这样做,是由于cin.get(name1,size1)和cin.getline(arryName,size)返回一个cin对象;

  总结:getline()使用起来简单一些,但get()使得检查错误更简单些;例如:假设用get()将一行读入数组中。如何知道停止读取的原因是由于已经读取了整行,而不是由于数组已填满?查看一下下一个输入字符,如果是换行符,说明已经读取了整行;否则,说明该行中还有其他输入。

  3、sring类简介:要使用string类必须在程序中包含头文件string。string类位于名称空间std中,因此必须提供一条using编译指令,或者使用std::string来引用它。string 类定义隐藏了字符串的数组性质,能够像处理普通变量那样处理字符串。可以使用数组表示法来访问存储在string对象中的字符。注意:不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象!例如:

char bird1[10];

char bird2[10]="Mr.Cheeps";

string str1;

string str2="panther";

bird1=bird2;   // INVALID,no arry assignment

str1=str2;       // VALID,object assignment ok

  4、strcpy()strcat()strlen():函数由头文件cstring提供。简要说明:①strlen():计算字符串实际长度,不包括“