Re: char *
 
* Carmen Sei:
 why the following compile is OK
but will crash when execute?
the problem seem to in -    
convertToUppercase( phrase );
==========
// Converting lowercase letters to uppercase letters
// using a non-constant pointer to non-constant data.
#include <iostream>
using std::cout;
using std::endl;
#include <cctype> // prototypes for islower and toupper
using std::islower;
using std::toupper;
void convertToUppercase( char * );
int main()
{
   //char phrase[] = "characters and $32.98";
   char * phrase = "characters and $32.98";
The string literal has type 'char const [n]' in C++.
Implicit conversion from literal string to 'char*' is only supported for C 
compatibility.
You should not use it.
Instead, use std::string:
   std::string const phrase = "as?dljkasdl?kjasdl?kj";
Of course that doesn't match very well with your convertToUppercase functon.
   convertToUppercase( phrase );
   return 0; // indicates successful termination
} // end main
// convert string to uppercase letters
void convertToUppercase( char *sPtr )
{
   while ( *sPtr != '\0' ) // loop while current character is not '\0'
   {   
      if ( islower( *sPtr ) ) // if character is lowercase,
Well, this stuff is also dangerous, at least for users in non-English speaking 
countries.  A basic C library character oriented function takes int argument, 
but expects and requires a value corresponding to unsigned char.  You need to 
cast the argument to unsigned char to handle non-English characters correctly.
The islower() test is redundant, but if you had a valid reason to use islower() 
you should wrap it in a more safe function, like
   bool isLower( char c )
   {
       return !!std::islower( static_cast<unsigned char>( c ) );
   }
Then use isLower, not std::islower.
         *sPtr = toupper( *sPtr ); // convert to uppercase
And ditto.
      sPtr++; // move sPtr to next character in string
   } // end while
} // end function convertToUppercase
Cheers, & hth.,
- Alf