c++读入一行

8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00

被下面的报错折磨了一个半小时:

terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr: __pos (which is 11) > this->size() (which is 0)

基本题意就是输出没有包含的时间段,因为题目保证了给定的两个时间段之间最多只有一个交点,也就是没有区间重合的情形,所以思路就很简单,直接按照字符串的格式读进来排序遍历一遍就好。
C++读取一行可以用getline(cin,tmp),第三个参数默认为换行,也可以自行设定以什么为间隔,其中tmp是string类型的变量,getline()需要#include< string >;
还可以用cin.getline(char *, int size), 定义一定大小的字符数组传入,读入size大小的长度,size中包含’\0’,如果一行中输入的长度大于size,后面的会丢掉,所以就记住用它必须保证读完一行,第三个参数默认为换行,也可以自行设定以什么为间隔。一般情况下size和字符数组的大小一样就好了。
c++读入一行_第1张图片
c++读入一行_第2张图片

但是要注意getline或者cin.getline()前面如果有cin或者scanf,一定要先getchar()吸收一下换行!!!,最离谱的是,没有getchar(),下面的代码还能排序,排好序之后还能for循环输出,但是一旦获取某个特定的元素,即str[i]就会是空,str[i].size()为0,原来是因为读入失败的问题…
当然其实遇到困难不要总是尝试一种方法,既然无法读取一行,以空格分隔读进来也是可以处理的,一种方法行不通就换方法吧,不要执念于一种方法。
ps:同样能AC的代码,用java只能17/25,最后两个点超内存,还是少用java
写算法题吧。。。

#include
using namespace std;
vector<string> str;
int main(){
    int N;
    cin >> N;
    getchar();
    for(int i=0;i<N;i++){
        string tmp;
        getline(cin,tmp);
        str.push_back(tmp);
    }
    str.push_back("00:00:00 - 00:00:00");
    str.push_back("23:59:59 - 23:59:59");
    sort(str.begin(),str.end());
    for(int i=0;i<str.size()-1;i++){
        if(str[i].substr(11,8)==str[i+1].substr(0,8)){
            continue;
        }else{
            cout << str[i].substr(11,8) << " - " << str[i+1].substr(0,8) << endl;
        }
    }
    return 0;
}

你可能感兴趣的:(PAT刷题,算法)