首页 > 解决方案 > 函数 find() 工作不正确

问题描述

我的任务是检查一个数字是否包含8。我已将数字转换为 astd::string并使用了它的find()方法。但它仅适用于以 开头的数字8,例如8,等。对于 , 等数字81,它不起作用。8811828

#include <iostream>
#include <math.h>
#include <string>

using namespace std;

unsigned long long g = 0;


int main()
{
    string str;
    cin >> str;
    int f = stoi(str);
    string eig = "8";
    for (int a = 1; a <= f; a++)
    {
        string b = to_string(a);
        if (b.find(eig) != size_t() && b.rfind(eig) != size_t())
        {
            cout << "It worked with " << b << "\n";
            g++;
        }
        
    }
    cout << g;
}

标签: c++stringfind

解决方案


您正在使用std::string::find()并且std::string::rfind()不正确。size_t()如果未找到匹配项,它们不会返回。他们改为 返回std::string::npos(即)。值为 0,因此如果根本没有找到匹配项 ( ),或者匹配第一个字符以外的任何字符 ( ),则评估为真。这不是你想要的。size_type(-1)size_t()find(...) != size_t()-1 != 0>0 != 0

此外,您的使用rfind()是多余的,因为如果find()找到匹配项,则rfind()保证也会找到匹配项(尽管不一定是相同的匹配项,但您并不试图区分它)。

尝试这个:

#include <iostream>
#include <string>
using namespace std;

unsigned long long g = 0;

int main()
{
    int f;
    cin >> f;
    for (int a = 1; a <= f; a++)
    {
        string b = to_string(a);
        if (b.find('8') != string::npos)
        {
            cout << "It worked with " << b << "\n";
            ++g;
        }        
    }
    cout << g;
}

推荐阅读