我的输入和输出有问题。我在 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 接受了错误的参数。
由于您显然正在尝试解析时间,因此使用
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(×tamp, "[%I:%M %p]: ");
std::cout << "Timestamp: " << std::put_time(×tamp, "%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);
}
}
}
理论上,您可以编写一个区域设置方面来解析所需的格式,但除非您要大量使用这种特定格式,否则这可能比它的价值更麻烦。