[nfbcs] C++ question

Joseph C. Lininger devnull-nfbcs at pcdesk.net
Mon Nov 12 05:26:10 UTC 2018


IN effect, that's what the transform() function shown in my example 
does. It steps over each character, applying the toupper() function to 
each character. In fact, that idiom can be applied any time you have a 
collection (a string is a collection of characters in this context) and 
you want to iterate over that collection performing the same operation 
on each item.

There is one point I should clarify because I didn't expand on it. I 
said this is harder than it needs to be. The reason I said that is that 
most modern languages that have a string object also have the ability to 
create an uppercase string without the need for auxiliary functions or 
transformations. ON the flip side, modifying a string in place the way 
C++ can takes a bit more doing in those languages, so I guess it's a 
matter of what you're trying to accomplish.

Joe


On 11/11/2018 23:11, jim Barbour wrote:
> Here's some example code...
>
> #include <string>
>   
> using namespace std;
>   
> string strtolower(string str);
> string strtoupper(string str);
>   
> int main(int argc, char *argv[])
> {
>      cout << strtoupper("loWer") << endl;//LOWER
>      cout << strtolower("loWer") << endl;//lower
>      cout << strtoupper("UPPER") << endl;//UPPER
>      cout << strtolower("UPPER") << endl;//upper
>      cout << strtoupper("`az{") << endl; //`AZ{
>      cout << strtolower("@AZ[") << endl; //@az[
> }
>   
> string strtoupper(string str)
> {
>      int leng=str.length();
>      for(int i=0; i<leng; i++)
>          if (97<=str[i]&&str[i]<=122)//a-z
>              str[i]-=32;
>      return str;
> }
> string strtolower(string str)
> {
>      int leng=str.length();
>      for(int i=0; i<leng; i++)
>          if (65<=str[i]&&str[i]<=90)//A-Z
>              str[i]+=32;
>      return str;
> }
>
>
>
> On Sun, Nov 11, 2018 at 11:03:54PM -0500, Joseph C. Lininger via nfbcs wrote:
>> I originally didn't copy the list, but I decided this might be useful for
>> everyone. So, here's my response to this message.
>>
>>
>> What you'll want depends on whether or not you're using the older style C
>> strings or the newer C++ style string objects. I'm assuming, because you
>> said C++, that it's string objects you're using. In that case, first make
>> sure you have #included the string header, like this:
>>
>> #include <string>
>>
>> You would have had to do that anyway to make the string object available,
>> but figured I'd mention it anyway. While you're at the top of your file,
>> also make sure you have this line. You'll need it for the transformation I'm
>> going to show you.
>>
>> #include <algorithm>
>>
>> Finally, make sure you have:
>>
>> using namespace std;
>>
>> Now, for the case conversion. This problem is, unfortunately, harder than it
>> should be. You have two choices.
>>
>> 1. Apply a transformation to the String, whereby you use the transform()
>> function in conjunction with the old C toupper() function to convert each
>> character to uppercase. (You have to use the old C toupper, not the one from
>> C++, which I'll show you how to do.)
>>
>> 2. Convert the C++ string to a traditional C null-terminated string (char *
>> if you're a C guy), then use strupper to convert that to upper case. Be
>> careful with memory locations and such if you elect to do this.
>>
>> I'll show how to do it using option 1 since that doesn't require you ever
>> convert the String object to something else. Assuming you have a string
>> called theString, you would write a line like this to convert it to
>> uppercase using transform().
>>
>> transform(theString.begin(), theString.end(), theString.begin(), ::toupper);
>>
>> Here's a sample program that reads a string, then converts to uppercase and
>> displays it. I actually compiled and ran this, so I know it works at least
>> on my setup.
>>
>> #include <iostream>
>> #include <string>
>> #include <algorithm>
>>
>> using namespace std;
>>
>> int main()
>> {
>>      string theString;
>>      cout << "Enter a string: ";
>>      cin >> theString;
>>      // The magic is the next line
>>     transform(theString.begin(), theString.end(), theString.begin(),
>> ::toupper);
>>      cout << "The string is: " << theString << "\n";
>> }
>>
>> Hope this helps.
>> Joe
>>
>> On 11/11/2018 20:19, gwunder--- via nfbcs wrote:
>>> My grandson has asked for his grandfather's help, and although I have not
>>> coded in C++, so far I've been able to help. We are stumped by the need to
>>> convert a string to one case. It matters not at all to us if that is upper
>>> or lower case. We need to see if a string read forward or backward is the
>>> same-a palindrome. Though we find a function called toupper, we do not find
>>> the library in which it resides. It appears not to work on more than one
>>> character at a time.
>>>
>>>
>>> So if any of you can write me off list, how do we convert a string to one
>>> case?
>>>
>>>
>>> Thank you.
>>>
>>>
>>>
>>> _______________________________________________
>>> nfbcs mailing list
>>> nfbcs at nfbnet.org
>>> http://nfbnet.org/mailman/listinfo/nfbcs_nfbnet.org
>>> To unsubscribe, change your list options or get your account info for nfbcs:
>>> http://nfbnet.org/mailman/options/nfbcs_nfbnet.org/devnull-nfbcs%40pcdesk.net
>> _______________________________________________
>> nfbcs mailing list
>> nfbcs at nfbnet.org
>> http://nfbnet.org/mailman/listinfo/nfbcs_nfbnet.org
>> To unsubscribe, change your list options or get your account info for nfbcs:
>> http://nfbnet.org/mailman/options/nfbcs_nfbnet.org/jbar%40barcore.com
>>




More information about the NFBCS mailing list