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