首页 > 解决方案 > 检查同名项目是否已存在的 For 循环的问题

问题描述

有人可以向我解释为什么这没有做我想做的事吗?我希望用户能够输入至少 5 个项目,但是,我想确保所有项目都是唯一的。当他们输入我希望随后输入的项目名称时(检查那里没有其他同名的项目)。我有一个(基于范围的 for 循环)迭代向量,但是,当我放入两个相同的时,它不会循环回到开始它只是继续,并且由于某种原因它只检查和迭代向量一次。有人可以帮我吗?我已经工作了几个小时试图解决这个问题。

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";

}

标签: c++c++11

解决方案


我相信这个问题来自第一次调用std::cin.ignore();

当您第一次获得项目名称时,它会忽略第一个字母(因此,如果您输入“apple”,您会得到“pple”)。当您循环回添加一个项目(我认为)时,相同的忽略调用会删除换行符,因此当您再次输入名称时,您会得到全名(例如“苹果”)。

我认为,如果您将第一个调用移至std::cin.ignore();在循环中调用 AddNewItem() 的任何位置之后,事情可能会奏效。


推荐阅读