c++ - 检查同名项目是否已存在的 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";
}
解决方案
我相信这个问题来自第一次调用std::cin.ignore();
当您第一次获得项目名称时,它会忽略第一个字母(因此,如果您输入“apple”,您会得到“pple”)。当您循环回添加一个项目(我认为)时,相同的忽略调用会删除换行符,因此当您再次输入名称时,您会得到全名(例如“苹果”)。
我认为,如果您将第一个调用移至std::cin.ignore();
在循环中调用 AddNewItem() 的任何位置之后,事情可能会奏效。
推荐阅读
- azure - 使用 azure devops 构建流水线
- bash - bash脚本在systemd中运行的脚本中找不到源文件
- git - 删除其他提交的合并提交中间
- python - Python BDD 测试所有数据组合
- airflow-scheduler - 如何根据气流时间戳添加数据库分区
- c# - 使用 ImageMagick.NET 控制代码中的图像设置(代码等效于命令行 -define)
- azure - Azure 中的启动脚本(如 GCP 中的 metadata_startup_script)
- c++ - 如何在 wxGrid 的同一个单元格中添加 wxTextCtrl 和 wxButton?
- reactjs - 即使在验证变量时,对象也可能出现“空”编译器错误 - TypeScript
- php - 如何在 PHP-Laravel 的一个模型中拥有多个相同的多态关系?