c++ &STL对多行字符串的读取

一、cin

cin只能读取一连串的字符串,以空格或者回车符结束读取,故而含有空格的一串字符串就无法正确读取,比如下图:hello world 就只读取到了 hello空格后的那部分没有读取到比在这里插入图片描述

二、cin.getline([字符数组],[读取长度],(结束标志 默认为’\0’))

如果要读取的字符串是以字符数组的形式存储,则可以用cin.getline(),如下图:在这里插入图片描述
但是,FBI WARNING前面有其他cin读入的话 要另用一个getline()来清空缓存区,也可以用cin.ignore(); 如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、getline(cin,string s)对string类型的读取

getline()函数包含在<string>’头文件当中,如果不用万能头的话记得加上
另外getline也和cin.getline()存在相同的问题,如果前面代码块出现了cin>>n,记得用另外一个清空一下缓存

附上问题来源,蓝桥杯第九届C++A组

`#include <bits/stdc++.h>
using namespace std;
//char s1[20+5];
//char s2[20+5];
string s1,s2;
int a0,b0,a1,b1; 
int n;
const int ad = 24*60*60;//多了24小时 
int change1(string s){
	return ((int)(s[0] - 48)) * 10*60*60 + ((int)(s[1] - 48)) *60*60 + ((int)(s[3]-48))*10*60 + ((int)(s[4] - 48))*60 +((int)(s[6] - 48)) * 10+((int)(s[7] - 48));
}
int change2(string s){
     return ((int)(s[9] - 48)) * 10*60*60 + ((int)(s[10] - 48)) *60*60 + ((int)(s[12]-48))*10*60 + ((int)(s[13] - 48))*60 +((int)(s[15] - 48)) * 10+((int)(s[16] - 48)); 
}
int time_change(int t){
	int h = t / 3600;
	int m = (t-t/3600 *3600) / 60;
	int s = t%60;
	printf("%02d",h);
	printf(":");
	printf("%02d",m);
	printf(":");
	printf("%02d\n",s);
} 
int main(){
	//字符数字的转换int a = '3' - 48;
	//cout<<a;
	//cin>>s;//为什么cin会出先后面那组数据读取不了的情况 
	//getline(cin,s);
	//cout<<s[0]<<s[1]<<"  "<<s[3]<<s[4]<<" "<<s[6]<<s[7]<<" "<<endl;
	//cout<<s[9]<<s[10]<<" "<<s[12]<<s[13]<<" "<<s[15]<<s[16]<<" "<<endl;
	//cout<<s[20]<<endl;//最后一位的日子 
	cin>>n;
	getline(cin,s1);
	//消除上面那个cin的影响 
	while(n--){
		getline(cin,s1);
		getline(cin,s2);
		a0 = change1(s1);
		b0 = change2(s1);
		//cout<<s1<<"  "<<s2<<endl;
//		cout<<"s1="<<s1<<endl;
//		cout<<"s1[20]=="<<s1[20]<<endl;
		if(s1[20] == '1'){
		  b0 += ad;}
		else if (s1[20] == '2') {
		 b0+=2*ad;}
		else if(s1[20] == '3') {
		b0+= 3*ad;}
		s1[20] = '0';
		a1 = change1(s2);
		b1 = change2(s2);
		//cout<<s2[20]<<endl;
		if(s2[20] == '1'){
		  b1 += ad;}
		else if (s2[20] == '2'){
		  b1+=2*ad;}
		else if(s2[20] == '3'){
		 b1+= 3*ad;
	  }
	    s2[20] = '0';
		int gap = ((b1 - a1)+(b0-a0)) >> 1;
		time_change(gap);	
	}
	return 0;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值