Working with strings

M

madhu

i have a string " 1; 200; 03; 4567; a; b; 7; 11; 9; 0.01; 0.11; 0,12;
140; 15; 16; 17;"

i want to check for alphabetical values from a to z .when i find them i
should give a mesage
incorrect input
std::vector<float> StringMap::getValueMatrix(const std::string& key)
{
std::string value = getValueString (key);
vector<float> matrix_value;
stringstream msg;

while(!value.empty()) {
string::size_type pos1 = value.find(";");
string::size_type pos2 = value.find(":");
//checks for ;, : in value
if(pos1<pos2)
{

if (!isdigit(value.substr(0, pos1).c_str()))
{
cout<<"Not a valid input";
break;
}
matrix_value.push_back (atof(value.substr(0, pos1).c_str()));
value.erase(0, pos1 + 1);
}
else
{
if (isdigit(value.substr(0, pos2).c_str()))
{
cout<<"Not a valid input";
break;
}
matrix_value.push_back (atof(value.substr(0, pos2).c_str()));
value.erase(0, pos2 + 1);
}
}

return matrix_value;
}

i tried using isdigit()
but i get an error
c:\_users\mbanda\veo_win32_workspace\tools\src\InteractionServer\VeoKit\StringMap.cxx(339):
error C2664: 'isdigit' : cannot convert parameter 1 from 'const char *'
to 'int'

please can anyone help me to know the correct method to do it

thanks in advance

madhu
 
K

kwikius

madhu wrote:

[...]
if (!isdigit(value.substr(0, pos1).c_str()))
[...]

please can anyone help me to know the correct method to do it

AFAIK its something like so :

if( (pos1 != std::string::npos) // npos if not found
&& ( ! isdigit(value.at(pos1) ) ) ){
{
std::cout<<"Not a valid input\n";
}
}
// or
if( (pos1 != std::string::npos)
// requires #include <locale>
&& ( ! isdigit( value.at(pos1),std::locale::classic() ) ) ){
{
std::cout<<"Not a valid input\n";
}
}

regards
Andy Little
 
V

Victor Bazarov

madhu said:
i have a string " 1; 200; 03; 4567; a; b; 7; 11; 9; 0.01; 0.11; 0,12;
140; 15; 16; 17;"

i want to check for alphabetical values from a to z .when i find them
i should give a mesage
incorrect input

The most common way of doing that is to convert all the values as you
normally would (using a string stream or 'strtod', for example, and if
a conversion fails, report the error.
std::vector<float> StringMap::getValueMatrix(const std::string& key)
{
std::string value = getValueString (key);
vector<float> matrix_value;
stringstream msg;

while(!value.empty()) {
string::size_type pos1 = value.find(";");
string::size_type pos2 = value.find(":");
//checks for ;, : in value
if(pos1<pos2)
{

if (!isdigit(value.substr(0, pos1).c_str()))

OK, RTFM on 'isdigit' and look up on the web how it's to be used.

Briefly: it checks a _single_character_, not the whole string. By
definition, if your 'subst' is, say, "4567", is it *a* digit? No.
It's a bunch of them. How can you check a string for being a digit?
You can only check one symbol. You could rewrite your program to
check _each_ character of that substring, or you could simply convert
it as you normally would, but using a _proper_ function, like 'strtod'
and if the pointer to the end of the converted sequence (again, RTFM)
is not returned as the end of the string, there is an invalid symbol
somewhere in the string you're trying to convert.
{
cout<<"Not a valid input";
break;
}
matrix_value.push_back (atof(value.substr(0, pos1).c_str()));

Do NOT use 'atof' anywhere in your production code. It's a very bad
function. Its existence ought to have been cancelled in C++.
value.erase(0, pos1 + 1);
}
else
{
if (isdigit(value.substr(0, pos2).c_str()))

Same sentiment as above. Read about 'isgidit' in you C book.
{
cout<<"Not a valid input";
break;
}
matrix_value.push_back (atof(value.substr(0, pos2).c_str()));
value.erase(0, pos2 + 1);
}
}

return matrix_value;
}

i tried using isdigit()
but i get an error
c:\_users\mbanda\veo_win32_workspace\tools\src\InteractionServer\VeoKit\StringMap.cxx(339):
error C2664: 'isdigit' : cannot convert parameter 1 from 'const char
*' to 'int'

please can anyone help me to know the correct method to do it

There is usually more than one correct method to do it. You will have
to choose one and use it.

Conversion from a stream into a set of number is a very common problem
and you should be able to find several solutions in every decent C++
book. What book are you reading that doesn't have a chapter on stream
I/O with error detection?

V
 
M

madhu

thanks for your i mail .i have changed total implementation of my
function.here is my code

std::vector<float> StringMap::getValueMatrix(const std::string& key)
{
vector<float> defRetValue ;
std::string value = getValueString (key);
vector<float> matrix_value;

while (!value.empty ())
{
//checks for ;, : in value
string::size_type pos = value.find_first_of (";:");
if (pos == string::npos)
{
//Return default return value
cout << "end of the value";
//return(defRetValue);
break;
}

string keyValue = value.substr (0, pos);
bool letter = false;
for (string::size_type i = 0; i < keyValue.size (); i++)
{
letter = letter || (isalpha (keyValue) != 0);
}
if (!letter)
{
matrix_value.push_back (atof (keyValue.c_str ()));
}
value.erase (0, pos + 1);
}

cout << "Debug: Within getValueMatix" << endl;
for (vector<float>::size_type i = 0; i < matrix_value.size (); ++i)
{
cout << matrix_value << " ";
}
cout << endl;

return matrix_value;
}


Thanks for your suggestions.I was actualy confused with some functions
..Now am clear with the concept
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top