关于C++的“cin”等有关输入的知识点汇总

# 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!
```

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值