Working with strings

Discussion in 'C++' started by madhu, May 29, 2006.

  1. madhu

    madhu Guest

    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
    madhu, May 29, 2006
    #1
    1. Advertising

  2. madhu

    kwikius Guest

    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
    kwikius, May 29, 2006
    #2
    1. Advertising

  3. madhu wrote:
    > 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
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
    Victor Bazarov, May 29, 2006
    #3
  4. madhu

    madhu Guest

    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
    madhu, May 30, 2006
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Kurt Krueckeberg
    Replies:
    2
    Views:
    697
    =?ISO-8859-1?Q?Ney_Andr=E9_de_Mello_Zunino?=
    Nov 17, 2004
  2. Rick

    Comparing strings from within strings

    Rick, Oct 21, 2003, in forum: C Programming
    Replies:
    3
    Views:
    369
    Irrwahn Grausewitz
    Oct 21, 2003
  3. Klaus Neuner
    Replies:
    7
    Views:
    475
    Klaus Neuner
    Jul 26, 2004
  4. Girish Sahani
    Replies:
    17
    Views:
    560
    Boris Borcic
    Jun 9, 2006
  5. Ben

    Strings, Strings and Damned Strings

    Ben, Jun 22, 2006, in forum: C Programming
    Replies:
    14
    Views:
    740
    Malcolm
    Jun 24, 2006
Loading...

Share This Page