7.14. Character classification¶
It is often useful to examine a character and test whether it is upper
or lower case, or whether it is a character or a digit. C++ provides a
library of functions that perform this kind of character classification.
In order to use these functions, you have to include the header file
cctype.
char letter = 'a';
if (std::isalpha(letter)) {
std::cout << "The character " << letter << " is a letter.\n";
}
You might expect the return value from isalpha to be a bool, but
it is actually an integer.
It returns 0 if the argument is not a letter,
and some non-zero value if it is.
C++ inherits this odd behavior from the C language, which C++
was originally based on and it has kept these oddities mostly
for compatibility with C.
This oddity is not as inconvenient as it seems, because it is legal to
use this kind of integer in a conditional, as shown in the example. The
value 0 is treated as false, and all non-zero values are treated as
true.
Other character classification functions include isdigit, which
identifies the digits 0 through 9, and isspace, which identifies all
kinds of “white” space, including spaces, tabs, newlines, and a few
others. There are also isupper and islower, which distinguish
upper and lower case letters.
Finally, there are two functions that convert letters from one case to
the other, called toupper and tolower. Both take a single
character as a parameter and return a (possibly converted) character.
char letter = 'a';
letter = toupper (letter);
cout << letter << '\n';
The output of this code is A.
As an exercise, use the character classification and conversion library
to write functions named string_to_upper and string_to_lower that
take a single string as a parameter, and that modify the string by
converting all the letters to upper or lower case. The return type
should be void.
Try writing the string_to_upper and string_to_lower functions in the
commented sections of the active code below.
Both functions take a single string
as a parameter and have return type void.
string_to_upper should convert the string to uppercase, and
string_to_lower should convert the string to lowercase.
Some functions that you might find useful include
isalpha, isupper, islower, toupper, and tolower.
If you get stuck, you can reveal the extra problems at the end for help.
1#include <cctype>
2#include <iostream>
3#include <string>
4using std::cout;
5using std::string;
6
7void string_to_upper (string &input) {
8 // ``string_to_upper`` should convert a string to uppercase.
9 // Write your implementation here.
10}
11
12void string_to_lower (string &input) {
13 // ``string_to_lower`` should convert a string to lowercase.
14 // Write your implementation here.
15}
16
17int main() {
18 string upper = "This String Should Be Converted To Uppercase!";
19 string_to_upper (upper);
20 cout << upper << '\n';
21 string lower = "This String Should Be Converted To Lowercase!";
22 string_to_lower (lower);
23 cout << lower << '\n';
24}
Reveal Problem
Let's write the code for the string_to_upper function. string_to_upper
should convert a string to uppercase.
-
i++; } } -
input[i] = toupper(input[i]); } -
toupper(input[i]); } -
if (isalpha(input[i]) && islower(input[i])) { -
if (isalpha(input[i]) && isupper(input[i])) { -
std::size_t i = 0; -
void string_to_upper (string &input) { -
void string_to_upper (string input) { -
while (i < input.length() - 1) { -
while (i < input.length()) {
Reveal Problem
Let's write the code for the string_to_lower function. string_to_lower
should convert a string to lowercase.
-
i++; } } -
input[i] = tolower(input[0]); } -
input[i] = tolower(input[i]); } -
if (isalpha(input[i]) && isupper(input[i])) { -
if (isalpha(input[i]) || isupper(input[i])) { -
std::size_t i = 0; -
void string_to_lower (string &input) { -
void string_to_lower (string input) { -
while (i < input.length()) { -
while (i > input.length()) {