在C++中,一次输入过程是这样的,当从输入设备中输入数据后会先存储在输入流缓冲区中,在有相应的操作符从缓冲区中读取数据,由于在C++中有:cin,cin.get(),cin.getline()三种操作符,因此需要在不同情况使用不同的操作符。
一、cin
<span style="font-size:14px;">#include<iostream>
using namespace std;
int main()
{
const int a = 20;
char name[a];
char dessert[a];
cout << "Enter your name:\n";
cin >> name;
cout << "Enter your favorite dessert:\n";
cin >> dessert;
cout << "I have some delicious " << dessert;
cout << " for you, " << name << endl;
return 0;
}</span>
如果在第一次出入中输入Hello zero后会发现直接跳过“输出dessert”的过程,直接显示程序。
原因是cin使用空白(回车、空格和制表符)来确定字符串的位置,这意味着cin在获取字符数组时只能读取一段字符,读取完后自动在结尾添加空字符'\0'。
在这个例子中cin把Hello作为第一个字符串读入到name中,把zero放入输入流缓冲区中,当再次读取时,cin会先在缓冲区搜索,找到zero,把它放到delicious中。
要想读取一整行的输入就要用到cin.getline()和cin.get()。
二、cin.getline()
cin.getline()函数读取一整行数据并通过回车来作为结束符,不保存换行符。
该函数包含两个参数,形如cin.getline(string s,int n) ,在cin.getline(string s,int n)中,第一个参数string使用来存储输入行的数组的名称,而第二个参数int则是要读取的字符数,但要保留最后一位添加空字符'\0'。例如,如果第二个参数为20,那么函数最多只能读取19位,最后一位自动保留用来添加'\0'.示例如下:
#include<iostream>
using namespace std;
int main()
{
const int a = 20;
char s1[a];
char s2[a];
cout << "Enter first line:\n";
cin.getline(s1,a);
cout << "Enter second line:\n";
cin.getline(s2,a);
cout << "Display it:\n";
cout << s1 << endl ;
cout << s2 << endl;
return 0;
}
程序输出如下:
Enter first line:
hello zero
Enter second line:
hello world
Display it:
hello zero
hello world
三、cin.get()
cin.get有几种变体。其中一种为cin.get(string s,int a),与cin.getline()类似,接受参数的方式相同,含义也相同,都以换行符作为结尾,但是cin.get()并不丢弃换行符,而是将其保存在输入队列中。
#include<iostream>
using namespace std;
int main()
{
const int a = 20;
char s1[a];
char s2[a];
cout << "Enter first line:\n";
cin.get(s1,a);
cout << "Enter second line:\n";
cin.get(s2,a);
cout << "Display it:\n";
cout << s1 << endl ;
cout << s2 << endl;
return 0;
}
当我们再次输入hello zero时会发现当要输入s2时会自动跳过并直接输入结果。
这是因为,由于第一次调用后,换行符保留在输入流缓存中,当再一次调用get()时,读取到的第一个字符是换行符,因此,get()认为已经到达行尾了。
要想跳过换行符进行下一次读取,需要用到cin.get()另一个变体,即无参数的cin.get(),无参数的cin.get()只读取一个字符,因此可以用它来处理换行符来读取下一行。可以采用如下方式:
cin.get(s1,a);
cin.get();
cin.get(s2,a);
cin.get();
有关cin的相关操作还有很多变体,以上三种是最常用的,相对来说比较简单的,想要深入了解的可以看看《C++ primer plus》
参考书籍:《C++ primer plus》