Ваша программа имеет полное неопределенное поведение.
Давайте начнем с первой проблемы. В следующем контрольном коде
long int value, strValue; // not initialised
for (int i = 0; i < events.size(); i++)
{
// ...
// here it should have been "setpassword" (i.e. all are small letters)
if (events[i][0] == "setPassword")
{
// if the check fails the `value` never get initialised!
value = hashingfunct(events[i][1], M);
}
// If the `value` not been initialised, check happens with any garbage value here!
else if (strValue == value)
// ...other code
}
вы проверяете, соответствует ли строка "setPassword"
вместо "setpassword"
(т.е. см. В векторе events
, все строки - маленькие буквы).
Если что-то пойдет не так, value
никогда не будет инициализирован, что означает, что он содержит любое значение мусора и, следовательно, проведение этой проверки else if (strValue == value)
может вызвать любое поведение в вашу программу (также известную как Undefined Behavior ) .
Во-вторых, vector<int> result;
пусто в начале. Следовательно, доступ к элементам через std::vector::operator[]
позже
result[j++] = 1;
// ...
result[j++] = 1;
// ...
result[j++] = 0;
запускает доступ за пределы (UB) . Там вам нужно просто result.emplace_back(/*value*/);
или result.push_back(/*value*/);
, и нет необходимости в редутантной переменной j
.
Короче, вам нужно
#include <iostream>
#include <vector>
#include <string>
// ..other functions
int main()
{
std::vector<std::vector<std::string> > events {
{"setpassword", "1"}, // can be also user input, like in your example
{"setpassword", "2"},
{"setpassword", "3"},
{"authorize", "49" },
{"authorize", "50" }
};
std::vector<int> result;
const long int M = pow(10, 9) + 7;
long int value{ 0 }, strValue{ 0 }; // default initialization
for (const std::vector<std::string> row: events) // better use range-based loop
{
strValue = std::stoi(row[1]);
if (row[0] == "setpassword") {
value = hashingfunct(row[1], M);
if (strValue == value)
result.emplace_back(1);
else if (authorize(strValue, value, M))
result.emplace_back(1);
}
else
result.emplace_back(0);
}
}
В качестве примечания: