недопустимые операнды в бинарном выражении при использовании std :: replace c ++

0

У меня есть вектор, который содержит имена пользователей и пароли. Я пытаюсь выполнить функцию "сбросить новый пароль", в результате чего я сначала ищу имя пользователя в векторе, существовало ли имя пользователя, а затем пользователю будет предложено ввести новый пароль, а старый пароль будет заменен на новый.

но я столкнулся с этой ошибкой

Invalid operands to binary expression ('User' and 'const std::__1::basic_string<char>')

Из-за этой линии.

replace(userDetails.begin(), userDetails.end(), oldPassword, newPassword);

часть моих кодов, связанных с проблемой

string name;
cout << "Please enter a user name that the password will be reset \n";
cin >> name;

for (int i =0; i<userDetails.size(); i++) {
    if (userDetails[i].getUserName() == name) {
        string newPassword;
        string oldPassword;
        oldPassword = userDetails[i].getPassword();
        cout << "Please enter a new password" << endl;
        cin >> newPassword;
        replace(userDetails.begin(), userDetails.end(), oldPassword, newPassword);
        cout << userDetails[i].getPassword();
    }
}

Я не уверен, что я должен сделать, чтобы достичь желаемых результатов. Пожалуйста помоги. благодаря

  • 0
    Попробуйте переименовать переменные *Password в foo и bar . Оскорбительная строка все еще заменяет то же самое, что и раньше? Просмотр фактической документации для std::replace также может помочь.
Теги:

2 ответа

2

Первая проблема в строке

replace(userDetails.begin(), userDetails.end(), oldPassword, newPassword);

вы пытаетесь заменить объект User объектом std::string.

Вторая проблема (как упоминалось в работе nm) - вам не нужно использовать функции на основе диапазона (replace() или другие) внутри цикла, когда вы уже имеете руки на соответствующем объекте User.

Вы можете использовать std::find_if() чтобы найти объект User с собственным именем вместо написания цикла. В С++ 11 это возможно следующим образом:

auto user = find_if(userDetails.begin(), userDetails.end(),
                   [&name](const User& u){return u.getUserName()==name;});

В коде pre С++ 11 вам понадобится отдельная предикатная функция вместо лямбда/собственного цикла поиска (просто break; когда пользователь будет найден).

Если пользователь найден, вы можете установить пароль:

if(user != userDetails.end()){
    // (ask for the new password here)
    user->setPassword(newPassword); // assuming you have a setter for password field
}
  • 1
    Вы хотите найти всех пользователей с одинаковым паролем X и заставить их всех использовать новый пароль Y, верно? Это совершенно новый подход к безопасности, но, вероятно, не то, что имел в виду ФП.
  • 0
    Ой ну спасибо! Меня больше интересовал подход, а не детали. Редактирование :)
Показать ещё 3 комментария
1

Кажется, что в вашем контейнере userDetails хранятся объекты User, но вы рассматриваете его так, как будто он содержит std::string s. Вы должны заменить пароль userDetails[i]. Как это сделать, это зависит от деталей класса User.

Вероятно, вы хотите что-то подобное, используя std::find_if с подходящим предикатом, чтобы найти первого пользователя с именем пользователя, равным name:

// find the right User
auto it = std::find_if(userDetails.begin(),
                       userDetails.end(),
                       [&name](const User& user) 
                       { return user.getUserName() == name;})

затем замените пароль для этого пользователя:

if (it != userDetails.end()) {
  // we found a user with username == name
  it->setPasswd(newPasswd);
} else
  // no user found with that username
  std::cout << "User " << name << " not found" << std::endl;
}
  • 0
    так вы имеете в виду, что я не должен использовать вектор, который содержит объекты, а просто нормальный вектор, который содержит строки?
  • 0
    @ user2947249 Нет, просто замените пароли в соответствующих объектах.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню