My task is to check if a number contains 8 or not. I've converted the number into a std::string and have used its find() method. But it only works with a number which starts with 8, for example 8, 81, 881, etc. For numbers like 18, 28, etc, it doesn't work.
#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;
}
CodePudding user response:
You are using std::string::find() and std::string::rfind() incorrectly. They do not return size_t() if a match is not found. They return std::string::npos (ie size_type(-1)) instead. size_t() has a value of 0, so find(...) != size_t() will evaluate as true if no match is found at all (-1 != 0), or any character other than the first character is matched (>0 != 0). This is not what you want.
Also, your use of rfind() is redundant, since if find() finds a match then rfind() is guaranteed to also find a match (though just not necessarily the same match, but you are not attempting to differentiate that).
Try this:
#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;
}
CodePudding user response:
#include <iostream>
#include <string>
#include <cassert>
int main(int argc, char **argv) {
auto s = std::to_string(1234567890);
assert(s.find('8') != std::string::npos);
return 0;
}
Is this what you want?
