-1

我正在尝试在结构中搜索我输入的值。但是,即使我只输入单词的一部分,我也希望搜索能够正常工作。我该怎么做呢?

这是我的代码:

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;
    }
}
4

4 回答 4

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!
    }
}

例如,如果你有一个名为“snickers”和“snack mix”的糖果,那么如果你输入“sn”,它会返回这两个,但如果你输入“sni”,你只会得到“snickers”。

于 2013-10-24T20:27:46.783 回答
0

首先,您需要一个阈值来确定匹配的接近程度。1个字母好吗?

其次,决定它是否必须从开头匹配,还是从单词的开头匹配,例如“气味”是否有效?

然后,如果您不想使用另一个库,请遍历每个 char 并继续,直到达到阈值或字符串末尾

换句话说,如果名称是“Long dude one”并且搜索字符串是“dude”,则从 name[0] 开始并执行 4 次迭代循环(dude 中的四个字母)并检查每个与对应的一个来自名字。如果任何字母不匹配,则退出该循环。然后从 name[1] 到 name[4],然后从 name[2] 到 name[5] 一直执行相同的操作,直到您检查搜索字符串“one”的最后 4 个字母与 dude。但是,您不会走那么远,因为在第 6 次尝试时,例如循环通过 name[5] 到 name[8],所有 4 个字母都会匹配,因此您将设置 match=true 并退出。

把它放在一个函数中并为每个名字调用它。

于 2013-10-24T20:24:38.923 回答
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;
    }
}
于 2013-10-24T21:04:05.243 回答
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;
    }
}

如果您想不区分大小写,只需将两个字符串都转换为全部大写或全部小写,然后对修改后的字符串进行搜索。

于 2013-10-24T20:29:36.847 回答