四、关于c++的复合类型(二)

字符串

1.什么是字符串?字符串是存储在内存的连续字节中的一系列字符,C++处理字符串有两种方式:一种来自C语言,称为C-风格字符串,另一种是基于string类库的方法

2.存储在内存的连续字节中的一系列字符意味着可以存储在char数组当中,而对于C-风格字符串具有一种特质:以空字符串'\0'结尾

    如:

   char a[5] = {'a','b','c','d','e'};  //不是一个字符串,不以\0结尾

   char a[5] = {'a','b','c','d','\0'}; //是字符串,以\0结尾

   但两个都是char数组

3.在2点中,数组初始化的方法看起来很冗长乏味,使用大量单引号,还需要记住结尾的空字符。下面介绍另一种简单的将字符数组初始化为字符串的方法:

char a[11] =  "Hello World";  //注意双引号,结尾隐式包含空字符,不用显式包含它

char a[] = "Hello World";

也可以使用键盘输入,将字符串读到char数组中,也会自动添加结尾的空字符

4.使用字符数组存储字符串需要保证数组空间足够大,能存储字符串(空字符也应该计算进去)

   char a[5] = "Hello";  //编译出错,因为加上空字符,字符串长度是6,而数组长度只有5

   char a[] = "Hello";

    sizeof(a);  //6,Hello 5  + \0 1 = 6

    char a[11] = "Hello";

    sizeof(a); // 11,显示的是数组的大小

5.注意''和""

   'S'与"S"

   'S'是字符常量,接触过ASCLL码的人知道,S的ASCLL是83,'S'其实就是83的另一种写法

  char a = 'S';// 其实是将83赋值给a

  "S"不是字符常量,它是两个字符('S'和'\0')组成的字符串,而且"S"其实表示的是该字符串所在的内存地址

  char a = "S"; //是错误的,将一个地址赋给char类型

6.sizeof运算符与strlen()函数

   char a[10] = "Hello";

   sizeof(a);   //10,数组的长度

   strlen(a); //5,计算可见的字符,不把空字符计算在内,需要包含cstring头文件

7.字符串输入

7.1cin输入:由于不能通过键盘输入空字符,因此cin需要通过别的办法判断字符串的结尾位置,cin使用空白(空格、制表符、换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只能读取一个单词,读取单词后将它放进数组中,并自动在结尾添加空字符,但现实中往往不只读取一个单词,可能是多个单词中间以空格隔开组成的字符串。

7.2每次读取一行输入

iostream中的类(如cin)提供了一些面向行的类成员函数:getline()和get(),这两个函数都读取一行输入直到到达换行符。

7.2.1getline()

调用方法:cin.getline(),该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数(如果这个参数是20,最多输入19,剩下的空间用于存储自动在结尾添加的空字符),getline()在读取指定数目的字符或遇到换行符停止读取

char a[20];

cout<<"请输入字符串:";

cin.getline(a,19);//读取的时候会把换行符也读取进去来判断行尾,然后存储时用空字符代替换行符

7.2.2get()

istream类中,该函数有几种变体,其中一种和getline()的使用类似,接收参数一样,并且都读到行尾,但是,不同的是get()不会读取换行符,并替换成空字符,还把换行符留在输入队列里,幸运的是,get()有一种变体,不带任何参数,调用读取下个字符,可以用它处理换行符,为下一行读取做准备。

char a[20];

cout<<"请输入字符串:";

cin.get(a,19);

cin.get(); //处理换行符

//也可以写成 cin.get(a,19).get()  因为cin.get(a,19)返回一个cin对象,又可以调用get方法

7.2.3优先使用get()

首先,老式实现没有getline();再者,get()输入更仔细。假如get将一行读入数组中,如何知道停止读取的原因是由于已经读取整行还是由于数组已经填满?查看下一个输入字符,如果是换行符说明已经读取了整行,如果不是,说明该行还有其他输入可是数组已经填满。

7.2.4如果使用cin>>输入字符串(只输入一个单词),然后回车,此时回车键产生的换行符将影响下面的行的输入,可以使用cin.get()接收这个换行符

cin>>a;

cin.get();

等价于

(cin>>a).get();  //cin>>a返回一个cin对象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章