程序有错误吗?在抛出 'std::invalid_argument' 实例后调用

问题描述 投票:0回答:1

我的输入和输出有问题。我在 Visual Studio 中的代码不会抛出任何错误,但我尝试发送代码的平台会抛出运行时错误。

抛出“std::invalid_argument”实例后调用终止 什么():斯托伊

输入:

5
[05:00 a.m.]: Server is started
[05:00 a.m.]: Rescan initialized
[01:13 p.m.]: Request processed
[01:10 p.m.]: Request processed
[11:40 p.m.]: Rescan completed
Output: 2

我的代码:

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm>
#include <fstream>
#include <typeinfo>

using namespace std;

int main() {
    ifstream fin;
    ofstream fout;
    fin.open("input.txt");
    string s;
    int n, hh, mm;
    fin >> n;
    vector<string>A;
    for (int i = 0; i < n+1; i++) {
        string s;
        getline(fin, s);
        if (s != "") A.push_back(s);
    }
    fin.close();
    int days = 1;
    vector<int>t;
    for (int i = 0; i < A.size(); i++) {
        hh = stoi(A[i].substr(1, 2));
        mm = stoi(A[i].substr(4, 2));
        string x = A[i].substr(7, 1);
        int time = hh * 60 + mm;
        if (time == 0) days++;
        if (x == "p" && time != 720) time += 720;
        t.push_back(time);
    }
    for (int i = 1; i < t.size(); i++) {
        if (t[i] < t[i - 1]) days++;
    }
    fout.open("output.txt");
    fout << days;
    fout.close();
}

我不知道 stoi 接受了错误的参数。

c++ string file-io
1个回答
0
投票

由于您显然正在尝试解析时间,因此使用

std::get_time
可能是最简单的。理想情况下,您应该让他们稍微改变格式,这样您的输入将如下所示:

[05:00 am]: Server is started
[05:00 am]: Rescan initialized
[01:13 pm]: Request processed
[01:10 pm]: Request processed
[11:40 pm]: Rescan completed

通过此输入,您可以执行以下操作:

    std::string line;
    while (std::getline(input, line)) {

        std::stringstream buffer(line);        
        std::tm timestamp;

        buffer >> std::get_time(&timestamp, "[%I:%M %p]: ");

        std::cout << "Timestamp: " << std::put_time(&timestamp, "%R\n");
    }

如果你无法让它们更改格式,你可以编写一个小函数来“修复”它,如下所示:

void fix_ampm(std::string &s) {
    std::map<std::string, std::string> fixes {
        { "a.m.", "am"},
        { "p.m.", "pm"}
    };

    for (auto const &[find, rep] : fixes) {
        auto pos = s.find(find);
        if (pos != std::string::npos) {
            s.replace(pos, find.size(), rep);
        }
    }
}

理论上,您可以编写一个区域设置方面来解析所需的格式,但除非您要大量使用这种特定格式,否则这可能比它的价值更麻烦。

© www.soinside.com 2019 - 2024. All rights reserved.