std::isalnum(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

✨ std::isalnum ✨

okay bestie, so we're diving into std::isalnum from the C++ Standard Library. lowkey iconic, ngl. πŸ’…


🌸 SYNOPSIS 🌸

Defined in header <cctype>
int isalnum( int ch );

so basically this checks if the given character is an alphanumeric character as classified by the current C locale. no cap. in the default locale, the following characters are alphanumeric:

  • digits (0123456789)
  • uppercase letters (ABCDEFGHIJKLMNOPQRSTUVWXYZ)
  • lowercase letters (abcdefghijklmnopqrstuvwxyz)
⚠️ bestie listen ⚠️ β€” the behavior is undefined if the value of ch is not representable as unsigned char and is not equal to EOF. like, don't do it. it's giving undefined behavior energy and we don't stan that. 😭

πŸŽ€ PARAMETERS πŸŽ€

  • ch β€” character to classify (the main character, fr fr)

πŸ’– RETURN VALUE πŸ’–

Non-zero value if the character is an alphanumeric character, 0 otherwise. slay. that's the whole tea. ✨


πŸ¦‹ NOTES πŸ¦‹

Like all other functions from <cctype>, the behavior of std::isalnum is undefined if the argument's value is neither representable as unsigned char nor equal to EOF. so basically, to use these functions safely with plain chars (or signed chars), the argument should first be converted to unsigned char:

bool my_isalnum(char ch)
{
    return std::isalnum(static_cast<unsigned char>(ch));
}

similarly, they should not be directly used with standard algorithms when the iterator's value type is char or signed char. instead, convert the value to unsigned char first:

int count_alnums(const std::string& s)
{
    return std::count_if(s.begin(), s.end(),
                      // static_cast<int(*)(int)>(std::isalnum) // wrong
                      // [](int c){ return std::isalnum(c); }    // wrong
                      // [](char c){ return std::isalnum(c); }   // wrong
                         [](unsigned char c){ return std::isalnum(c); } // correct
                        );
}

like the comments literally spell it out for you bestie, the unsigned char version is the only correct one. the others are lowkey wrong and we don't do wrong here. πŸ’€


🌈 EXAMPLE 🌈

this one demonstrates the use of std::isalnum with different locales (OS-specific, so ymmv bestie 🫢).

// Run this code
#include <cctype>
#include <clocale>
#include <iostream>

int main()
{
    unsigned char c = '\xdf'; // German letter ß in ISO-8859-1

    std::cout << "isalnum(\'\\xdf\', default C locale) returned "
              << std::boolalpha << static_cast<bool>(std::isalnum(c)) << '\n';

    if (std::setlocale(LC_ALL, "de_DE.iso88591"))
        std::cout << "isalnum(\'\\xdf\', ISO-8859-1 locale) returned "
                  << static_cast<bool>(std::isalnum(c)) << '\n';

}

⭐ Possible output:

isalnum('\xdf', default C locale) returned false
isalnum('\xdf', ISO-8859-1 locale) returned true

literally the same character getting different treatment depending on locale. it's giving "who am I really" existential crisis and honestly? relatable. πŸ¦‹


πŸ‘‘ SEE ALSO πŸ‘‘

  • isalnum(std::locale) β€” checks if a character is classified as alphanumeric by a locale (function template)
  • iswalnum β€” checks if a wide character is alphanumeric (function)
  • C documentation for isalnum

πŸ“Š the whole ASCII vibe check (character classification table) πŸ“Š

okay so this is a LOT of data but it's all here bestie, no skipping. each row is a range of characters and then a bunch of β‰ 0 / 0 values for each classification function. β‰ 0 means yes, 0 means no. periodt. πŸ’…

ASCII values            characters    iscntrl  isprint  isspace  isblank  isgraph  ispunct  isalnum  isalpha  isupper  islower  isdigit  isxdigit
decimal hexadecimal   octal                   iswcntrl iswprint iswspace iswblank iswgraph iswpunct iswalnum iswalpha iswupper iswlower iswdigit iswxdigit
0–8     \x0–\x8     \0–\10    control codes   β‰ 0       0        0        0        0        0        0        0        0        0        0        0
                                 (NUL, etc.)
9       \x9         \11       tab (\t)        β‰ 0       0        β‰ 0       β‰ 0       0        0        0        0        0        0        0        0
                                 whitespaces
10–13   \xA–\xD     \12–\15   (\n, \v, \f,    β‰ 0       0        β‰ 0       0        0        0        0        0        0        0        0        0
                                 \r)
14–31   \xE–\x1F    \16–\37   control codes   β‰ 0       0        0        0        0        0        0        0        0        0        0        0
32      \x20        \40       space           0        β‰ 0       β‰ 0       β‰ 0       0        0        0        0        0        0        0        0
33–47   \x21–\x2F   \41–\57   !"#$%&'()*+,-./ 0        β‰ 0       0        0        β‰ 0       β‰ 0       0        0        0        0        0        0
48–57   \x30–\x39   \60–\71   0123456789      0        β‰ 0       0        0        β‰ 0       0        β‰ 0       0        0        0        β‰ 0       β‰ 0
58–64   \x3A–\x40   \72–\100  :;<=>?@         0        β‰ 0       0        0        β‰ 0       β‰ 0       0        0        0        0        0        0
65–70   \x41–\x46   \101–\106 ABCDEF          0        β‰ 0       0        0        β‰ 0       0        β‰ 0       β‰ 0       β‰ 0       0        0        β‰ 0
71–90   \x47–\x5A   \107–\132 GHIJKLMNOP      0        β‰ 0       0        0        β‰ 0       0        β‰ 0       β‰ 0       β‰ 0       0        0        0
                                 QRSTUVWXYZ
91–96   \x5B–\x60   \133–\140 [\]^_`          0        β‰ 0       0        0        β‰ 0       β‰ 0       0        0        0        0        0        0
97–102  \x61–\x66   \141–\146 abcdef          0        β‰ 0       0        0        β‰ 0       0        β‰ 0       β‰ 0       0        β‰ 0       0        β‰ 0
103–122 \x67–\x7A   \147–\172 ghijklmnop      0        β‰ 0       0        0        β‰ 0       0        β‰ 0       β‰ 0       0        β‰ 0       0        0
                                 qrstuvwxyz
123–126 \x7B–\x7E   \172–\176 {|}~            0        β‰ 0       0        0        β‰ 0       β‰ 0       0        0        0        0        0        0
127     \x7F        \177      backspace       β‰ 0       0        0        0        0        0        0        0        0        0        0        0
                                 character (DEL)

that's the whole table bestie, every single row, nothing skipped. ikyk. 🧚


okay that's the whole page!! hope this helped you understand std::isalnum bestie, you're gonna do amazing. stay slaying those characters. πŸ’œβœ¨πŸŒΈ

β€” the tea was spilled with love from http://cppreference.com, dated 2024.06.10, and you already know the manual page is std::isalnum(3). mwah πŸ’‹

πŸ“¦ where this page comes from