1.前言
在C++中,可应用 cin, cin.getline(), cin.get() 它们都可以分别输入字符串。而他们也有各自的优缺点,在输入格式不同的要求下,我们又该怎么选择呢,接下来我们看看他们究竟是怎么输入字符串。
2.使用cin
我们先来看看程序实例1
#include<iostream>
using namespace std;
int main(){
const int Size = 20;
char address[Size];
char name[Size];
cout << "Please enter your address:\n";
cin >> address;
cout << "Please enter your name:\n";
cin >> name;
cout << "Yor address is: " << address << endl;
cout << "Your name is: " << name;
return 0;
}
运行结果:
Please enter your address:
New York
Please enter your name:
Yor address is: New
Your name is: York
从运行结果我们可以看出,我们还没有对"Please enter your name:”做出反应,程序便把它显示出来了,这显然是错误的,不符合输入要求。
cin使用空格,制表符,换行符来确定字符串的结束位置,这也就意味着cin在获取字符数组时只读取一个单词。
这个例子结果是:cin把New作为第一个字符串,并把它放到address数组中。这把York留在输入队列中,当cin在输入队列中搜索name时,它发现了York,因此cin读取York,并将它放到name数组中。
3.使用getline()
从上一个例子我们可以看到cin的缺点,当程序要求输入地址名,用户输入New York。我们希望程序读取并存储完整的城市名,而不是New。
也就是要将一行语句作为输入,而不是某个单词。而接下来要介绍的面向类的成员函数getline()正好具有面向行输入的功能。
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数是要读取的字符数。如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline )成员函数在读取指定数目的字符或遇到换行符时停止读取
例如,假设要使用getline将姓名读入到一个包含20个元素的name数组中。可以使用这样的函数调用:
cin.getline(name,20);
程序实例1:
#include<iostream>
using namespace std;
int main(){
const int Size = 20;
char address[Size];
char name[Size];
cout << "Please enter your address:\n";
cin.getline(address,Size);
cout << "Please enter your name:\n";
cin.getline(name,Size);
cout << "Yor address is: " << address << endl;
cout << "Your name is: " << name;
return 0;
}
运行结果:
Please enter your address:
New York
Please enter your name:
Ailece
Yor address is: New York
Your name is: Ailece
从运行结果我们可以看出cin.getline()是将New York作为一个字符串真题进行输入。
注意:getlint()函数每次读取一行,它通过换行符来确定行尾,但不保存换行符。
4.使用get()
我们来试试另一种方法。istream类有另一个名为get()的成员函数,该函数有几种变体。其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get并不再读取并丢弃换行符,而是将其留在输入队列中。假设我们连续两次调用get( ):
程序实例
#include<iostream>
using namespace std;
int main(){
const int Size = 20;
char address[Size];
char name[Size];
cout << "Please enter your address:\n";
cin.get(address,Size);
cout << "Please enter your name:\n";
cin.get(name,Size);
cout << "Yor address is: " << address << endl;
cout << "Your name is: " << name;
return 0;
}
运行结果:
Please enter your address:
New York
Please enter your name:
Yor address is: New York
Your name is:
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾,而没有发现任该换行符。
幸运的是,使用不带任何参数的cin.get()可以读取下一个字符(即使是换行符)因此可以使用它来处理换行符,为下一行读取做好准备,例如:
程序实例:
#include<iostream>
using namespace std;
int main(){
const int Size = 20;
char address[Size];
char name[Size];
cout << "Please enter your address:\n";
cin.get(address,Size);
cin.get(); //吸收换行符
cout << "Please enter your name:\n";
cin.get(name,Size);
cout << "Yor address is: " << address << endl;
cout << "Your name is: " << name;
return 0;
}
运行结果:
Please enter your address:
New York
Please enter your name:
Alice
Yor address is: New York
Your name is: Alice
5总结:
如果有小伙伴这方面的知识掌握不是很好,记得多敲,多敲几遍就记住啦。如果觉得有帮助,还请支持一下博主啦。