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

c++特殊类型之字符串类型(c++ primer plus)

2017-03-27 10:24 70 查看
字符串是存储在内存的连续字节中的一系列字符。c++处理字符串的方式有两种。第一种来自于c语言,称为c-风格字符串。另一种是基于string类库的方法。

第一种来自于c语言,

初始化: 字符串是存储在连续字节中的一系列字符串,意味着可以将字符串存储在char数组中,其中每个字符都位于自己的数组元素中。char 字符串数组的初始化方法有两种:①char
dog[8]={'a','c','g','e','\0'};②char dog[8]="acge";(第①种方法末尾必须加上空字符,否则不能被称作字符串而只是一个字符数组;第②种方法字符串隐式的包括结尾的空字符,不用显示的包括它,所以更方便使用)警告:在确定存储字符串所需的最短数组时,别忘了将结尾的空字符计算在内,而且必须保证数组足够大

拼接字符串常量:字符串很长,无法放在同一行。c++允许将两个用引号括起来的字符串合并为一个,事实上,任何两个由空白(空格、制表符和换行符)分割的字符串都将自动合并为一个。比如:

cout<<"I am ""xiao ming\n";//引号
cout<<"I am " "xiao ming\n";//空格
cout<<"I am "
"xiao ming\n";//换行符

在数组中使用字符串:

char dog[8]="acge";
cout<<sizeof(dog);
cout<<strlen(dog);
结果为:8和4。说明了sizeof()返回数组的长度是8字节,而strlen()返回的是存储在数组中的字符串的长度(不含空字符)4字节,而不是数组本身的长度

字符串输入:每次读取一行

每次读取一个单词通常不是最好的选择,比如

char dogName[8];
cout<<"The name of dog is\n";
cin>>dogName;
cout<<"I like "<<dogName<<"\n";
输入:大黄  黄;输出:I like大黄

因此需要采用另一种字符串读取方法。即采用面向行而不是面向单词的方法。istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get(),这两个函数都读取一行输入,直到到达换行符。

1:getline():

getline()函数读取整行,它使用通过输入的换行符来确定输入结尾,但不保存换行符。相反,在存储字符串时,它用空字符来替代换行符。调用方法:cin.getline()。该函数有两个参数,第一个参数用来存储输入行的数组名称;第二个参数是要读取的字符数。如参数为20,则读取19个字符,最后一个为空字符。getline()函数在读取指定数目的字符或者遇到换行符时结束读取。比如

char dogName[8];
cout<<"The name of dog is\n";
cin.getline(dogName,6);
cout<<"I like "<<dogName<<"\n";
输入:D ssssssss 输出:D sss

1:get():

istream类有另一个名为get()的成员函数,该函数有几种变体。

形式①:与getline()函数类似他们接受的参数相同,并且都读到行尾。但是遇到换行符时,并不丢弃换行符,而是把它保留在输入队列里。加入我们连续两次调用此函数,第一次调用之后,换行符保留在输入队列里面因此第二次调用时看到的第一个字符便是换行符,因此get()认为已到达行尾,而没有发现任何可以读取的内容。如果不进行帮助,get()将不能跨过此换行符。

形式②:为了解决形式①的遗留问题,方法是在两次输入中插入cin.get();即可

形式③:cin.get(name,20).get();其效果与调用cin.getline()函数效果相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: