C++ - To UpperCase?

Discussion in 'C++' started by GRoll21, Oct 18, 2005.

  1. GRoll21

    GRoll21 Guest

    I know there is a function but I cannot seem to find it. There should
    be a way to uppercase a char right?

    Here is what I got.

    cout << "Enter title of a book for look up: ";
    cin >> firstString;

    if (strcmp(toupper(firstString), toupper(bookTitle[index])) == 0)

    then i check the book they enter to a book in my bookTitle array. How
    can I make it so it puts both firstString and bookTitle to uppercase?
    Any help would be great! Thanks!
     
    GRoll21, Oct 18, 2005
    #1
    1. Advertisements

  2. 'toupper' should do it. But you don't need to uppercase a char, do you?
    You need to uppercase a whole array of them, probably...
    What's a 'firstString'?
    So, it's an array, eh? Then you need to iterate through the array and
    apply 'toupper' to every element. It's that simple.

    V
     
    Victor Bazarov, Oct 19, 2005
    #2
    1. Advertisements

  3. GRoll21

    GRoll21 Guest

    firstString is the book the user inputs.

    cout << "Enter title of a book for look up: ";
    cin >> firstString;
     
    GRoll21, Oct 19, 2005
    #3
  4. If you want to make the string all uppercase then just go through the
    string and convert all the characters:

    const char* strtoupper(string str)
    {
    for (int i=0;i<str.size();i++)
    str = toupper(str);
    return str.c_str();
    }
     
    jois.de.vivre, Oct 19, 2005
    #4
  5. GRoll21

    Jay Nabonne Guest

    If you just want to compare, you can use the case-insensitive version of
    strcmp. Now is it strcmpi or stricmp? (I'm not sure. :)

    - Jay
     
    Jay Nabonne, Oct 19, 2005
    #5
  6. GRoll21

    jalkadir Guest

    I wrote a set o f C++ classes that handle different types of string
    manipulations one of string manipulations that is most needed by
    programmers is the ability to convert the string to upper case:

    const std::string& jme::strtools::toUpper( const std::string& s ) {
    tmp = s;
    tmp = this->trimIt( tmp );
    for ( std::string::iterator i = tmp.begin(); i != tmp.end(); ++i )
    {
    *i = std::toupper( *i );
    }
    return tmp;
    }
    we are developing this library to be released under the GNU linces. So,
    if you are interested you can via AIM=jalqadir
    for a free copy of this library.

    Have fun!
     
    jalkadir, Oct 19, 2005
    #6
  7. GRoll21

    int2str Guest

    If you are working on a temporary copy anyway, why not simply declare
    it like this:

    const std::string& jme::strtools::toUpper( std::string s )

    Saves a few lines of code and does the same...
    Where is tmp declared?
    This function is called "toUpper()", why does it trim the string as
    well?
    How about:

    std::transform( tmp.begin(), tmp.end(), tmp.begin(),
    (int(*)(int))std::toupper );
    Why not check it into sf.net or similar?
    I'd like to see this library and monitor it's progress - maybe even
    contribute. It would be easier that way.

    Cheers,
    Andre
     
    int2str, Oct 19, 2005
    #7
  8. GRoll21

    Jack Klein Guest

    There is no case-insensitive version of strcmp() in the standard C or
    standard C++ library. What you are not sure of is the name of some
    particular non-standard function on some specific implementation, or
    perhaps the different names of several non-standard functions on
    different implementations.
     
    Jack Klein, Oct 19, 2005
    #8
  9. That is obvious, what Victor meant (I assume) is have you declared
    firstString like this

    std::string firstString;

    or something like this

    char firstString[99];

    These details matter.

    But in either case the answer is similar. You have a function toupper
    which converts a single character to uppercase, you have a string or a
    char array which is basically a whole bunch of characters, so you have
    to write a loop which uses toupper on each character in your string or
    char array.

    This is called programming, there always comes a point where the
    standard functions run out and you have to write your own. You've just
    reached it.

    john
     
    John Harrison, Oct 19, 2005
    #9
  10. GRoll21

    Neil Cerutti Guest

    You should not return a reference or pointer to automatic storage
    class variables. tmp is destroyed when the function returns,
    leaving the caller with a useless reference to a nonexistent
    string.
     
    Neil Cerutti, Oct 19, 2005
    #10
  11. GRoll21

    Shezan Baig Guest


    I suspect 'tmp' is a member of the 'strtools' class (or maybe a global
    variable). In any case, since it is not declared in function scope, it
    will *not* be destroyed when the function returns, so the reference is
    still valid.

    As to why we need this 'tmp' global variable is a good question. It
    definitely kills any possibillity of doing multi-threaded programming.
    I suspect the original author mistakenly thought it might be
    significantly more efficient to use an existing variable.

    -shez-
     
    Shezan Baig, Oct 19, 2005
    #11
  12. GRoll21

    Neil Cerutti Guest

    Ah. Whoops I didn't notice it went undeclared. Thanks for the
    correction.
     
    Neil Cerutti, Oct 19, 2005
    #12
  13. There is the CRT function/macro toupper from <cctype>, which converts a
    single character to upper case, using the C locale.
    There is the ctype facet of the C++ locale from <locale> which has a member
    toupper, which does the same, but using the C++ locale.
    There is a global toupper function in <locale>, which is essentially a
    shortcut to the ctype facet.

    To work on entire strings at the same time, I recommend the Boost String
    Algorithm library, available in Boost 1.32.0 and later.
    http://www.boost.org/doc/html/string_algo/usage.html#id1290831
     
    Sebastian Redl, Oct 19, 2005
    #13
  14. GRoll21

    Jay Nabonne Guest

    Well, that explains it, then. :)
     
    Jay Nabonne, Oct 19, 2005
    #14
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.