Операции с символами

Последнее обновление: 02.03.2023

Стандартная библиотека С++ также предоставляет ряд встроенных функций для работы с символами. В основном они связанны с проверкой символов:

  • isupper(c): проверяет, является ли c заглавной буквой, по умолчанию от "A" до "Z"

  • islower(c): проверяет, является ли c буквой нижнего регистра, по умолчанию от 'a' до 'z'

  • isalpha(c): проверяет, является ли c алфавитным символом

  • isdigit(c): проверяет, является ли c цифрой от '0' до '9'

  • isxdigit(c): проверяет, является ли c шестнадцатеричной цифрой, от '0' до '9', от 'a' до 'f' или от 'A' до 'F'

  • isalnum(c): проверяет, является ли c алфавитно-цифровым символом; аналогично isisalpha(c) || isdigit(c)

  • isspace(c): проверяет, является ли c пробелом (' '), символом перевода строки ('\n'), возвратом каретки ('\r'), перевод страницы ('\f'), горизонтальная ('\t') или вертикальная ('\v') табуляция

  • isblank(c): проверяет, является ли c пробелом (' ') или символом табуляция ('\t')

  • ispunct(c): проверяет, является ли c символом пунктуации (один из следующих: _ { } [ ] # ( ) < > % : ; ? * + - / ^ & | ~ ! "=")

  • isprint(c): проверяет, является ли c печатным символом, который включает прописные или строчные буквы,цифры, знаки пунктуации и пробелы

  • iscntrl(c): проверяет, является ли c управляющим непечатным символом

  • isgraph(c): проверяет, имеет ли c графическое представление

  • tolower(c): переводит символ c в нижний регистр

  • toupper(c): переводит символ c в верхний регистр

Например, проверим, в каком регистре символ:

#include <iostream> 

int main()
{
    unsigned char letter {'a'};
    if (std::isupper(letter))
        std::cout << "Uppercase letter" << std::endl;
    else if (std::islower(letter))
        std::cout << "Lowercase letter" << std::endl;
    else    // если не буквенный символ
        std::cout << "Undefined" << std::endl;
}

Данные функции очень часто применяются при обработке строк. Рассмотрим прстейшую задачу - нам надо извлечь из некоторого текста (например, из строки "Phone number: +1(234)456-78-90") номер телефона:

#include <iostream>
#include <string>

int main()
{
    std::string text {"Phone number: +1(234)456-78-90"};
    std::string phone;  // строка для хранения номера
    for(unsigned i{}; i < text.length(); i++)
    {
        // проверяем, является ли символ цифрой
        if(std::isdigit(text[i]))
        {
            // добавляем в строку номера телефона
            phone += text[i];
        }
    }
    std::cout << phone << std::endl;    // 12344567890
}

Здесь проходим по всем символам текста и, если символ представляет цифру, то заносим его в строку phone.

Другая задача - нам надо сравнить две строки вне зависимости от регистра. С одной стороны, мы могли бы использовать простую операцию сравнения ==, которая также может сравнивать строки. Но если мы попытаемся сравнить две строки, в которых хотя бы один символ отличается по регистру, то они будут не равны:

#include <iostream>
#include <string>

int main()
{
    std::string word1 {"HELLO"};
    word1 = "hello";
    std::string word2 {"hello"};
    if(word1 == word2)
    {
        std::cout << "strings are equal" << std::endl;
    }
    else
    {
        std::cout << "strings are not equal" << std::endl;
    }
}

Результат данной программы:

strings are not equal

Чтобы организовать сравнение без учета регистра, мы могли бы переводить символы в верхний или нижний регистр и сравнивать их:

#include <iostream>
#include <string>

int main()
{
    std::string word1 {"HELLO"};
    std::string word2 {"hello"};
    bool is_equal{true};    // равны ли строки
    if(word1.length() != word2.length())
    {
        is_equal = false;
    }
    else
    {
        // сравниваем все символы
        for(unsigned i{}; i < word1.length(); i++)
        {
            // переводим символы в нижний регистр и сравниваем
            if(std::tolower(word1[i]) != std::tolower(word2[i]))
            {
                // если символы не равны, сбрасываем флаг равенства
                is_equal = false;
                break;      // выходим из цикла
            }
        }
    }   
    if(is_equal)
    {
        std::cout << word1 << " and " << word2 << " are equal" << std::endl;
    }
    else
    {
        std::cout << word1 << " and " << word2 << " are not equal" << std::endl;
    }
}

В данном случае сначала сравниваем длину строк, так как если длины не равны, то сами строки тоже не равны.

Далее в цикле проходим по всем символам обоих строк, переводим их в нижний регистр и сравниваем. Если хотя бы одна пара соответствующих символов не равна, то сбрасываем флаг равенства is_equal в false и выходим из цикла, поскольку строки в этом случае будут уже не равны, и дальше нет смысла сравнивать символы.

Результат данной программы:

HELLO and hello are equal
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850