C/C++’s char
built-in type is a 1-byte type. char
can hold a value [-128, 127]
. The name char
can be confusing because a char
can range from printable characters to non-printable characters. It is easier to think of char
as a 1-byte signed integer.
Convert Character char
to Integer int
- Modern C++
Since C++11, a new C++ expressions have been added to do compile time casting. Compile-time casting is safer as errors can be checked during compile-time over run-time. Specifically, static_cast
was added which is perfect usage for converting character to integer.
#include <print>
#include <string>
void characterToInteger()
{
using namespace std;
char input = 'b';
// Modern C++ cast
int output = static_cast<int>(input);
println("Character {} as integer is {}", input, output);
}
Output:
Character b as integer is 98
Alternative Methods
Convert Character char
to Integer int
- Legacy C
I don’t recommend the legacy C-style casting of converting character to integer. However, in this case, it can be safely done.
ℹ️ Tech Info: We can cast from character to integer. The char
to int
conversion is called an integral promotion
(i.e., smaller integer to larger integer type). Additionally, because we don’t have to explicitly cast to the new type, this is considered an implicit conversion.
void characterToIntegerLegacy()
{
using namespace std;
char input = 'c';
// C-style cast
// casting from smaller to larger integer type
int output_c_style = input;
println("Character {} as integer is {}", input, output_c_style);
}
More static_cast
Examples
Convert Character to Digit
A common conversion of a single character char
is to representing a decmial digit (i.e., 0123456789
) as an integer value (e.g., int
).
This works in both C/C++. For example, we have a char
defined as 8
. First, check if the character by using isdigit
to check if the char
is a decimal digit. If it is, we can convert it to an integer. To convert the character to integer, we subtract '0'
(that is, the character literal '0'
) from the char. In code, it will look like:
Note: If char
just represents a number, then converting a char
to int
can be done without casting (‘promoted’) because int
is a wider type than char
.
The standard library header cctype
contains other handy character identification and conversion utility functions.
ℹ️ If we want to convert a string to its integer representation check this out: Convert String to Integer in C++.
#include <print>
#include <string>
#include <cctype>
void characterToDigit(char ch)
{
using namespace std;
// if char contains an numeric decimal digit (0-9)
if (isdigit(ch))
{
// convert character to digit
int digit = static_cast<int>(ch - '0');
println("'{}' becomes {}", ch, digit);
}
else
{
println("'{}' is not a digit", ch);
}
}
Output:
// '0' becomes 0
characterToDigit('0');
// '6' becomes 6
characterToDigit('6');
// '9' becomes 9
characterToDigit('9');
// 'X' is not a digit
characterToDigit('X');
Convert character to position in alphabet
Given a character, if the character is alphabet character, print its position in the alphabet, else print error.
#include <print>
#include <string>
#include <cctype>
void characterToAlphabetPosition(char ch)
{
using namespace std;
// check if alphabet character
if (isalpha(ch))
{
// make upper case to lower case so we can use the same formula
int lowerCaseCharacter = tolower(ch);
// from the lowercase character subtract 'a' (97) to offset to zero
int positionInAlphabet = static_cast<int>(lowerCaseCharacter - 'a');
// positions [0,25]
// 26 positions in total
println("{} is position {} in the alphabet", ch, positionInAlphabet);
}
else
{
println("{} is not in the alphabet", ch);
}
}
Output:
// d is position 3 in the alphabet
characterToAlphabetPosition('d');
// A is position 0 in the alphabet
characterToAlphabetPosition('A');
// 4 is not in the alphabet
characterToAlphabetPosition('4');
Print an ASCII table
Another excercise using static_cast
. We can print the entire ASCII and extended ASCII characters in a table. A few notes:
print
is new in C++23- the standard ASCII characters are
0 to 127
inclusive - the extended ASCII characters are
128 to 255
inclusive iscntrl
checks if character is a control character (e.g., new line), because they are not printable, print?
instead
#include <print>
#include <string>
void printAsciiTable()
{
using namespace std;
// adjustable results per row
constexpr int resultsPerRow = 11;
// print the ASCII and extended ASCII characters
for (int i = 0; i < 256; ++i)
{
// static_cast index i to a character
char ch = static_cast<int>(i);
// if control character, print a '?' instead of character
// static_cast to 'unsigned char' as it is required for iscntrl
if ( iscntrl( static_cast<unsigned char>(ch) ) )
{
// static_cast to int so print will
// show the integer value
print("? {}\t", static_cast<int>(ch));
}
// else print the character and it's ASCII value
else
{
print("{} {}\t", ch, to_string(ch));
}
// print a new line once row is filled with results
bool newRowBegin = (ch + 1) % resultsPerRow == 0;
if (newRowBegin)
{
println();
}
}
}
The output will be the ASCII and extended ASCII table:
? 0 ? 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10
? 11 ? 12 ? 13 ? 14 ? 15 ? 16 ? 17 ? 18 ? 19 ? 20 ? 21
? 22 ? 23 ? 24 ? 25 ? 26 ? 27 ? 28 ? 29 ? 30 ? 31 32
! 33 " 34 # 35 $ 36 % 37 & 38 ' 39 ( 40 ) 41 * 42 + 43
, 44 - 45 . 46 / 47 0 48 1 49 2 50 3 51 4 52 5 53 6 54
7 55 8 56 9 57 : 58 ; 59 < 60 = 61 > 62 ? 63 @ 64 A 65
B 66 C 67 D 68 E 69 F 70 G 71 H 72 I 73 J 74 K 75 L 76
M 77 N 78 O 79 P 80 Q 81 R 82 S 83 T 84 U 85 V 86 W 87
X 88 Y 89 Z 90 [ 91 \ 92 ] 93 ^ 94 _ 95 ` 96 a 97 b 98
c 99 d 100 e 101 f 102 g 103 h 104 i 105 j 106 k 107 l 108 m 109
n 110 o 111 p 112 q 113 r 114 s 115 t 116 u 117 v 118 w 119 x 120
y 121 z 122 { 123 | 124 } 125 ~ 126 ? 127 Ç 128 ü 129 é 130 â 131
ä 132 à 133 å 134 ç 135 ê 136 ë 137 è 138 ï 139 î 140 ì 141 Ä 142
Å 143 É 144 æ 145 Æ 146 ô 147 ö 148 ò 149 û 150 ù 151 ÿ 152 Ö 153
Ü 154 ¢ 155 £ 156 ¥ 157 ₧ 158 ƒ 159 á 160 í 161 ó 162 ú 163 ñ 164
Ñ 165 ª 166 º 167 ¿ 168 ⌐ 169 ¬ 170 ½ 171 ¼ 172 ¡ 173 « 174 » 175
░ 176 ▒ 177 ▓ 178 │ 179 ┤ 180 ╡ 181 ╢ 182 ╖ 183 ╕ 184 ╣ 185 ║ 186
╗ 187 ╝ 188 ╜ 189 ╛ 190 ┐ 191 └ 192 ┴ 193 ┬ 194 ├ 195 ─ 196 ┼ 197
╞ 198 ╟ 199 ╚ 200 ╔ 201 ╩ 202 ╦ 203 ╠ 204 ═ 205 ╬ 206 ╧ 207 ╨ 208
╤ 209 ╥ 210 ╙ 211 ╘ 212 ╒ 213 ╓ 214 ╫ 215 ╪ 216 ┘ 217 ┌ 218 █ 219
▄ 220 ▌ 221 ▐ 222 ▀ 223 α 224 ß 225 Γ 226 π 227 Σ 228 σ 229 µ 230
τ 231 Φ 232 Θ 233 Ω 234 δ 235 ∞ 236 φ 237 ε 238 ∩ 239 ≡ 240 ± 241
≥ 242 ≤ 243 ⌠ 244 ⌡ 245 ÷ 246 ≈ 247 ° 248 ∙ 249 · 250 √ 251 ⁿ 252
² 253 ■ 254
I hope it helps! ✌️