Searching for a value

Searching for a value

本文关键字:value for Searching      更新时间:2023-10-16

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

这是我的代码:

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

我假设如果您输入 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个字母可以吗?

其次,决定它是否必须从开头匹配,或者一个单词的开头,例如对"气味"确实有效?

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

换句话说,如果名称是"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 并退出。

将其放在一个函数中,并为每个名称调用它。

假设这些类型是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;
    }
}

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

可以使用成员函数比较如下方式

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