Re: Is this code to find an int in a string okay ?
In article
<85ec7280-977f-4651-a3f4-2199b4150d10@j44g2000hsj.googlegroups.com>,
Diwa <shettydiwakar@gmail.com> wrote:
Hi Guys,
Is there any better way than below to find an int in a string (e.g.
"30" in "KFStat30A")
// --------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main()
{
vector<string> strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");
std::string str;
for (int i=0; i<strs.size(); i++)
{
str = "";
int beg = strs[i].find_first_of("0123456789");
if (beg != string::npos)
{
int end = strs[i].find_first_not_of("0123456789", beg);
str.assign(strs[i], beg, end-beg);
}
cout << strs[i] << " " << str << "\n";
}
return 0;
}
// --------------------------------------------------------------
Thanks
What you have is fine, just wrap it into a function and it will look
like this:
string get_int( const string& s )
{
string result;
string::size_type front = s.find_first_of( "0123456789" );
if ( front != string::npos )
{
string::size_type back =
s.find_first_not_of( "0123456789", front );
result.assign( s, front, back - front );
}
return result;
}
.... or you can get creative:
bool is_digit( char c )
{
return isdigit( c );
}
string get_int( const string& s )
{
string::const_iterator front = find_if( s.begin(), s.end(),
&is_digit );
string::const_iterator back = find_if( front, s.end(),
compose1( logical_not<bool>(), ptr_fun( &is_digit ) ) );
return string( front, back );
}
(note: compose1 is part of STL, not part of the standard.)
Once you have the above function, you can operate on your array with
transform.
int main()
{
vector<string> strs ;
strs.push_back("KFStat30A");
strs.push_back("KFStat2A");
strs.push_back("555555");
strs.push_back("KKKKKK");
strs.push_back("KKKK555");
vector<string> ints;
transform( strs.begin(), strs.end(),
back_inserter( ints ), &get_int );
for ( int i = 0; i < strs.size(); ++i )
cout << strs[i] << ' ' << ints[i] << '\n';
}