PTA 7-56题福到了 探究cin语句紧接getline()语句的一点细节问题

1.问题的提出

#include<bits/stdc++.h>
using namespace std;
int main()
{
 vector<string> my;
 int n;char ch;
 cin>>ch>>n;                  //(1)
// getchar();                 //(2)
 for(int i=0;i<n;i++){        //为啥第一行读进来的始终是空字符串??? 
  string s; 
  getline(cin,s);             //(3)
  //输出读进来的字符串 
  cout<<"第"<<i<<"个s是"<<s<<endl;
  my.push_back(s); 
 }
 return 0;
}

解释一下代码的设计:

  1. 标号(1)处用cin语句读入一个字符和整数
  2. 标号(3)处用getline()语句循环n次读入n个string字符串
  3. 标号(2)处是后面更改用的,后面再说

问题:
原本的意思是:先输入ch和n,再依次输入n行字符串,存放在一个vector中。
如:

输入:
& 3
@@@
@
@@@
vector my中应当是:
my[0]"@@@"
my[1]
" @ "
my[2]=="@@@"

实际输出:
在这里插入图片描述
问题:
第一个string没有输出应该输出的“@@@”,而是输出了一个“空字符”,或许是空格或许是回车或许是tab等等。

2.探究输出了什么

  1. cin的流输入特点:跳过缓冲区中的空白符,从第一个空白符开始输入,输入完成后遇到空白符作为界止符,停止输入。值得注意的是,此时这个“界止符还停留在缓冲区中”,如果是连续的两个cin,那么执行第二个cin时将跳过这个第一个cin的界止符开始输入。
  2. getline()以’\n’为界止符,当getline紧接上述cin,缓冲区中留下的‘\n’将被getline读到,进而结束第一次getline读入,并且将界止符’\n’丢弃,字符串长度为0 。
  3. 结论就是:什么都没输出,第一个string中是空的。

3.解决办法

用标号(2)的getchar()将这个多余的回车符读取即可。
在这里插入图片描述

4.实际应用到题目上 PTA 7-56

PTA 7-56福到了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值