一、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;
}