关于C++文本输入的知识点汇总

338 阅读2分钟

cin型

  • 平时最常用的,也是最基本的输入方式,就是"cin>>input"的形式,比如:
int i;
cin>>i;

或者像是这样:

string str;
cin>>str;

注意:使用cin时需要提前声明using namespace std,否则应写为诸如std::cin>>i的形式。

cin.get()型

  • 当输入的内容中含有空格、回车或制表等的时候,此时cin不再使用,而采用cin.get()实现面向行的输入。具体如下:
char name[10];
cin.get(name,10);

注意:get并不会读取并丢弃换行符,而是将其留在输入队列里面,因此不能连续两次调用get(). 如下所示,此时第二次调用时看到的第一个字符便是换行符,因此cin.get()会认为已经到达行尾,而未发现可读取的内容,此时cin.get()将无法跨过换行符。

cin.get(name,10);
cin.get(str,20);
  • 为解决上述问题,可使用不带任何参数的cin.get()调用可读取下一个字符(包括换行符)。因此可用“cin.get();”来处理换行符,为读取下一行做准备。如下:
cin.get(name,10);
cin.get();//read new line
cin.get(str,20);

另一种表现形式是使用get()将两个类成员函数拼接起来。

cin.get(name,10).get();
cin.get(str,20);

此外,还可以使用getline()直接实现两个类成员函数相连,而不必使用get():

cin.getline(name,10)。getline(str,20);

cin.getline()型

  • getline()和get()函数都读取一行输入,直到到达换行符。随后getline()将丢弃换行符,而get()将换行符保留在输入序列里。
  • getline()的标准格式为cin.getline(字符数组名,字符个数,结束标志)若未写结束标志则默认为'\0' 如下:
char str[20];
cin.getline(str,8,'e');
cout<<str;

若输入“abcdefghijk”,将输出“abcd”.

注意:cin.get()和cin.getline()用于数组而非字符串,需要将字符串用数组的形式表达。

  • cin.getline()可以自由输入一行带空格和制表符的内容,这使得自由输入变得可能:
cin.getline(name,20);

这时输入hello world,输出的内容和输入的完全一致。而如果输出的字符数超过限制(如上述例子中的20),比如输入what is your favorite food,将会输出what is your favori,而不是输入的全部内容。值得注意的是,输出时最后一个字符必定是空字符(结束标志),它也会占据一个字符的位置,所以输出favori而非favorit。

输入字符串

string str;
cin>>str;

或者写为

string str;
getline(cin,str);//此时string对象会根据字符串长度自动调整自己的大小

这使得与使用数组的形式输入相比,使用string更加方便。因为我们可以把char数组视为一组用于存储一个字符串的单元。

混合输入字符串和数字

以《C++ Primer Plus》中的程序清单4.6为例:

#include<iostream>
using namespace std;
int main()
{cout<<"What year was your house built?\n";
int year;
cin>>year;
cout<<"What is its street address?\n";
char address[80];
cin.getline(address,80);
cout<<"Year built:"<<year<<endl;
cout<<"Address:"<<address<<endl;
cout<<"Done!\n";
return 0;
}

实际运行情况为:

What year was your house built?
1966
What is its street address?
Year built:1966
Address:
Done!

原因分析:当cin读取年份year时,换行符留在了year所在的输入队列中。之后cin.getline()识别到换行符时,会认为这是一个空行,这导致赋给address数组的是一个空字符串。

解决方法:在读取地址address前(读取year后)应该先读取并丢弃换行符。

  • 方法1 单独使用cin.get()使得换行符被读取并丢弃
cin>>year;
cin.get();//or cin.get(ch);
  • 方法2 将cin>>year与cin.get()拼接起来
(cin>>year).get();//or (cin>>year).get(ch);

修改以后最终输出为:

What year was your house built?
1966
What is its street address?
43821 Unsigned Short Street
Year built:1966
Address:43821 Unsigned Short Street
Done!