我正在尝试在结构中搜索我输入的值。但是,即使我只输入单词的一部分,我也希望搜索能够正常工作。我该怎么做?
这是我的代码:
for (int i = 0; i < size; i++)
{
if (searchName == ptrCandy[i].name)
{
cout << "Name: " << ptrCandy[i].name << "\n" << "Quantity: " << ptrCandy[i].quantity;
cout << "\n" << fixed << setprecision(2) << "Cost: $" << ptrCandy[i].cost << "\n" << endl;
}
}
答案 0 :(得分:1)
我假设如果您输入n个字符,您只想匹配以这n个字符开头的糖果元素,而不是尝试进行任何自动更正或拼写检查等。如果这些是正确的假设,那么让STL为您完成工作:
int searchLength = searchName.length();
for( int i=0; i<size; i++ ) {
if ( ptrCandy[i].name.length() >= searchLength &&
searchName == ptrCandy[i].name.substr( 0, searchLength ) ) {
// Found it!
}
}
例如,如果您有一个名为“士力架”和“零食组合”的糖果,那么如果您输入“sn”,它将返回这两个,但如果您输入“sni”,您将只获得“士力架” ”
答案 1 :(得分:0)
首先,您需要一个阈值来确定匹配的接近程度。是1个字母好吗?
第二,决定它是否必须从一开始或一个单词的开头匹配,例如是否对“气味”起作用?
然后,如果您不想使用其他库,请遍历每个字符并继续,直到达到阈值或字符串结尾
换句话说,如果名称是“Long dude one”并且搜索字符串是“dude”,则从name [0]开始并执行4迭代循环(dude中的四个字母)并检查每个名字中对应的一个。如果任何字母不匹配,退出该循环。然后从名称[1]到名称[4],然后从名称[2]到名称[5]等一直做同样的事情,直到你检查搜索字符串“1”的最后4个字母对抗花花公子。但是,你不会那么远,因为在第6次尝试时,例如循环通过名称[5]到名称[8],所有4个字母都匹配,所以你要设置match = true并退出。
将它放在一个函数中并为每个名称调用它。
答案 2 :(得分:0)
假设这些类型属于std::string
:
for (int i = 0; i < size; i++)
{
size_t pos = ptrCandy[i].name.find(searchName);
if (pos != string::npos)
{
cout << "Name: " << ptrCandy[i].name << "\n" << "Quantity: " << ptrCandy[i].quantity;
cout << "\n" << fixed << setprecision(2) << "Cost: $" << ptrCandy[i].cost << "\n" << endl;
}
}
如果你想要不区分大小写,只需将两个字符串转换为全部大写或全部小写,然后对修改后的字符串进行搜索。
答案 3 :(得分:0)
您可以使用成员函数比较以下方式
for (int i = 0; i < size; i++)
{
if ( ptrCandy[i].name.compare( 0, searchName.size(), searchName ) == 0 )
{
cout << "Name: " << ptrCandy[i].name << "\n" << "Quantity: " << ptrCandy[i].quantity;
cout << "\n" << fixed << setprecision(2) << "Cost: $" << ptrCandy[i].cost << "\n" << endl;
}
}