栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

c++读入一行

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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中包含’’,如果一行中输入的长度大于size,后面的会丢掉,所以就记住用它必须保证读完一行,第三个参数默认为换行,也可以自行设定以什么为间隔。一般情况下size和字符数组的大小一样就好了。

但是要注意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 str;
int main(){
    int N;
    cin >> N;
    getchar();
    for(int i=0;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
        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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/830628.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号