Проблемы с For L oop, который проверяет, существует ли уже элемент с таким именем - PullRequest
0 голосов
/ 26 января 2020

Может кто-нибудь объяснить мне, почему это не делает то, что я хочу? Я хочу, чтобы пользователь мог ввести не менее 5 элементов, однако я хочу убедиться, что все элементы являются уникальными. Когда они вводят название предмета, я хочу, чтобы он впоследствии (проверил, что там нет другого предмета с таким именем). У меня есть (ранжированный на основе l oop), который перебирает вектор, однако, когда я вставляю два одинаковых, он не возвращает l oop к началу, он просто продолжается, и по какой-то причине только проверяет и перебирает вектор один раз. Может кто-нибудь помочь мне? Я работал часами, пытаясь решить эту проблему.

bool Items::CheckIfItemExists(std::string &sInputName)
{
    for(const auto &Item : ItemsVec)
    {
        if (Item.GetItemName() == sInputName)
        {
            std::cout << "Item failed to add as there is already an item called that.\n";
            std::cin.clear();
            return false;
        }
    }
    return true;
}
void Items::AddNewItem()
{
    bool bValid = false;
    std::string sInputName;
    double dInputSalePrice = 0;
    int iInputQuantity = 0;
    do{
    std::cout << "Enter information for new item...\n";
    std::cout << "\tName: ";
    std::cin.ignore();
    std::cin.clear();
    std::getline(std::cin,sInputName);
    bValid = CheckIfItemExists(sInputName);
    }while(bValid == false);

    bool bSalePriceValid = false;
    do{
        std::cout << "\tSale price: £";
        std::cin >> dInputSalePrice;
        if(!std::cin)
        {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
            std::cout << "\n";
            std::cout << "Sorry, invalid input input. Try again!\n";
            std::cout << "\n";
        }
        else
        {
            bSalePriceValid = true;
        }
    }while(bSalePriceValid == false);

    bool bQuantityValid = false;
    do{
        std::cout << "\tQuantity sold: ";
        std::cin >> iInputQuantity;
        if(!std::cin)
        {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
            std::cout << "\n";
            std::cout << "Sorry, invalid input input. Try again!\n";
            std::cout << "\n";
        }
        else
        {
            bQuantityValid = true;
        }
    }while(bQuantityValid == false);

    Item NewItem(sInputName, dInputSalePrice, iInputQuantity);
    ItemsVec.push_back(NewItem);
    std::cout << "You've succesfully added a new item.\n";

}

1 Ответ

1 голос
/ 26 января 2020

Я полагаю, что проблема связана с первым вызовом std::cin.ignore();

Когда вы впервые получаете имя элемента, оно игнорирует первую букву (поэтому, если вы введете «яблоко», вы получите «pple») ). Когда вы вернетесь к добавлению элемента (я думаю), тот же самый игнорирующий вызов удалит новую строку, поэтому при повторном вводе имени вы получите полное имя (например, «яблоко»).

Я думаю, что все может работать, если вы переместите первый вызов на std::cin.ignore(); после того, где вы вызываете AddNewItem () в al oop.

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