4.2.1 定义
字符串是存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种:C-风格字符串,基于string库的方法。
4.2.2 C风格字符串
- C风格字符串有一种特殊的性质:以空字符结尾(\0)
eg:char dog[4]={'d','o','g','s'};
char cat[4]={'c','a','t','\0'};
以上都是字符数组,但只有第二个是字符串;第一组在cout中打印了四个字符后,如若后续内存中没出现空字符,则继续打印;
- 更简化的初始化字符数组:char cat[8]="cats",char cat[]="cats";
若字符数组元素不足则自动补空字符;
- 在确定储存字符串所需的最短数组是,记得将字符串结尾的空字符算进去;
- 字符串常量(双引号)和字符常量(单引号)不能互换;事实上,字符常量(如‘S’)是字符串编码的简写表示。在ASCII系统上,'S'只是83的另外一种写法,但"S"不是字符常量,它代表字符'S'和'\0'组成的字符串。实际上,"S"实际表示的是字符串所在的内存地址。
4.2.3拼接,输入字符串常量
当字符串很长,不能放在同一行。C++允许拼接字符串字面值,即将两个括号引起的字符串拼接成一个。或者说,任何两个由空白(空格,制表符,换行符)分割的字符串常量都可自动拼接。
eg: cout<<"I Love You" “forever!”;
cout<<"I Lov"
"e You forever!";
注:拼接时不会在被连接的字符串之间添加空格;
strlen()——计算字符串的长度;sizeof()——计算该变量所占的内存空间(字符串占的内存空间);
每次读取一行字符的输入:
- 面向行的输入:getline()——以换行符为结束,不保存换行符
- getline()函数读取整行,通过回车键的换行符来确定输入结尾;
- 使用cin.getline()调用;
- 该函数有两个参数,第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数;如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储空字符;
eg:char name[20];
cin.getline(name,20);
- getline()函数在读取指定数目的字符或遇到换行符时停止读取;
- 面向行的输入:get()——以换行符为结束,保存换行符
get()有许多种变体,其中一种变体工作方式与getline()类似,接受参数相同;
eg: cin.get(name,20);
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,因此get()函数将认为以及到达行尾,将结束第二次调用;而get()的另一种变体,不带任何参数的get()调用可读取下一个字符,故可用来处理换行符;
eg:cin.get(name,20);
cin.get();
cin.get(dessert,20);
另一种使用get()的方式是将两个类成员函数拼接起来(合并)
eg:cin.get(name,20).get();
同样,cin.getline(name,20).getline(dessert,20);其效果与两次调用cin.getline()相同;
3.getline()和get()的比较
- getline()——以换行符为结束,不保存换行符 get()——以换行符为结束,保存换行符
- get()使输入更仔细
- 当get()读取空行时,将会设置失效位(failbit),即接下来的输入会被阻断;
- 当输入字符串比分配空间长时,多的字符将会被留在输入队列中(输入流),而getline()还会设置失效位,并关闭后面的输入;
4.2.4 混合输入字符串和数字
#include "iostream"
int main()
{
using namespace std;
cout<<"please tell me your birthyear\n ";
int year;
(cin>>year).get();
cout<<"Please tell me your name\n";
cout<<"my name is :";
char name[10];
cin.get(name,10).get();
cout<<"your birthyear is "<<year<<"and";
cout<<"your name is "<<name;
return 0;
}
cin>>year在输入结束后会保留换行符在输入队列中,不捕获换行符则后面的输入调用会认为是空行,并把空字符串赋给name数组;