描述
在C++中,我们通常使用cin
作为输入函数来读取用户键盘输入的数据,由于不能通过键盘来输入空字符,因此cin
需要用别的方法来确定字符串结尾位置。cin
使用空白、空格、制表符和换行符来确定字符串的结束位置,这意味着cin
在读入数据的时候只能截取上述结束符前的数据,对于结束符后的数据讲不能读入程序中。我们来考一个cin
读入字符串的实例。
#include<iostream>
int main(){
using namespace std;
char name[30];
cout << "请输入您的姓名:";
cin >> name;
cout << "您的名字是:" << name << endl;
return 0;
}
运行上面的程序,当我们输入woody allen
时,程序会得到下面的结果:
请输入您的姓名:woody allen
您的名字是:woody
我们发现cin
函数读入的数据并不完整,在上述样例中输入的名字被空格键截断了,所以cin只读入了一个单词就结束了读入操作。再来考察一个类似实例看看输入缓冲区内发生了什么?
#include<iostream>
int main(){
using namespace std;
char name[30];
char addr[50];
cout << "请输入您的姓名:";
cin >> name;
cout << "请输入您的地址:";
cin >> addr;
cout << "您的名字是:" << name << endl;
cout << "您的地址为:" << addr << endl;
return 0;
}
运行上述程序,我们发现,还没对地址输入提示做出反应,程序就把他显示出来了。然后立即显示最后一行。运行结果如下所示:
请输入您的姓名:woody allen
请输入您的地址:您的名字是:woody
您的地址为:allen
解决
面向行输入:getline()
getline()
函数读取输入的整行,它使用通过回车键输入的换行符来作为结束符。要调用这种方法可以使用cin.getline()
,该函数有两个参数,第一个参数是用来存储输入行的数组名称,另一个参数是要读取的字符串长度,如果参数为30,则最多读取29各字符,最后一个用来存储在字符串末尾的空字符。
例如,假设要使用cin.getline()
将姓名读入到一个包含30各元素的name
数组中,可使用下面这样的函数调用:
cin.getline(name,30);
这样就可以将一行读入到数组中————如果这一行不超过29个字符(getline()
成员函数还可以接受第三个可选参数,在此不做讨论)。现在对上述样例进行修改如下:
#include<iostream>
int main(){
using namespace std;
char name[30];
char addr[50];
cout << "请输入您的姓名:";
cin.getline(name,30);
cout << "请输入您的地址:";
cin.getline(addr,50);
cout << "您的名字是:" << name << endl;
cout << "您的地址为:" << addr << endl;
return 0;
}
上述程序中将cin
换成了cin.getline()
,我们得到了正确的输入如下:
请输入您的姓名:woody allen
请输入您的地址:Guizhou China
您的名字是:woody allen
您的地址为:Guizhou China
getline()
函数每次读取一行,它通过回车键输入的换行符来确定行尾,但是不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。
面向行的输入get()
另外还有一种方法。istream
类有另一个名为get()
的成员函数,该函数有几种变体,其中一种与getline()
类似,他们接受相同的参数,解释参数的方式也相同,都读取到行尾。单get()
不再读取并丢弃换行符,而是将其留在输入队列中,假设我们连续两次调用get()
:
cin.get(name,arrSize);
cin.get(addr,arrSize);
运行上诉代码,我们会发现第二行代码并没有读入数据,原因是当第二行代码在读取数据时,把第一行读取的回车符当成了第二个字符串的结束标志,所以接下来的数据都没有读入,一个解决办法是将上诉代码改为:
cin.get(name,arrSize);
cin.get();
cin.get(addr,arrSize);
通过新增的cin.get();
先读取上一行留下来的换行符,然后再读取下一个字符串。
另一种使用get()
的方法是将两个类成员函数拼接起来使用,如下代码所示:
cin.get(name,addr).get();
之所以这样做,是由于cin.get(name,addr)
返回一个cin
对象,该对象随后将被用来调用get()
函数,同样,下面语句也能将输入的两行分别读到数组name
和addr
中,其效果与两次调用cin.getline()
相同:
cin.getline(name,ArSize).getline(addr,ArSize);
网友评论