C++
Как разбить слово на цифры и буквы в C++
Чтобы разбить строку на цифры и буквы в C++, пройдите по строке циклом. Для каждого символа проверьте: если это цифра, добавьте в строку digits; если буква — в строку letters
Пример для строки a1b2c3:
#include <cctype>
#include <iostream>
#include <string>
int main() {
std::string text = "a1b2c3";
std::string letters;
std::string digits;
for (char c : text) {
unsigned char uc = static_cast<unsigned char>(c);
if (std::isalpha(uc)) {
letters += c;
} else if (std::isdigit(uc)) {
digits += c;
}
}
std::cout << "Буквы: " << letters << std::endl;
std::cout << "Цифры: " << digits << std::endl;
return 0;
}
Вывод:
Буквы: abc
Цифры: 123
Разбор кода
letters хранит найденные буквы:
std::string letters;
digits хранит найденные цифры:
std::string digits;
Цикл проходит по каждому символу строки:
for (char c : text)
Проверка цифры:
std::isdigit(uc)
Проверка буквы:
std::isalpha(uc)
Приведение к unsigned char нужно для корректной работы функций <cctype> с возможными не-ASCII значениями
Вариант с вводом пользователя
#include <cctype>
#include <iostream>
#include <string>
int main() {
std::string text;
std::string letters;
std::string digits;
std::string other;
std::cout << "Введите строку: ";
std::getline(std::cin, text);
for (char c : text) {
unsigned char uc = static_cast<unsigned char>(c);
if (std::isalpha(uc)) {
letters += c;
} else if (std::isdigit(uc)) {
digits += c;
} else {
other += c;
}
}
std::cout << "Буквы: " << letters << std::endl;
std::cout << "Цифры: " << digits << std::endl;
std::cout << "Остальное: " << other << std::endl;
return 0;
}
Проверка:
Введите строку: a1-b2!
Буквы: ab
Цифры: 12
Остальное: -!
Что делать с русскими буквами
Для первых учебных задач используйте английские буквы. С русскими буквами все сложнее: char, кодировка файла, локаль и консоль могут дать разные результаты
Если задача именно про русский текст, сначала разберитесь с кодировкой и локалью. Для простого алгоритма разделения символов лучше начать с ASCII: a-z, A-Z, 0-9
Если цифры нужно превратить в число
В примерах выше цифры сохраняются как строка. Для a1b2c3 получится 123, но это все еще std::string. Если дальше нужно работать с числом, можно преобразовать строку через std::stoi:
#include <iostream>
#include <string>
int main() {
std::string digits = "123";
if (!digits.empty()) {
int number = std::stoi(digits);
std::cout << number + 10 << std::endl;
}
return 0;
}
Вывод:
133
Проверка !digits.empty() нужна, потому что для строки без цифр преобразовывать будет нечего. В реальном коде также стоит учитывать слишком большие числа и возможные исключения, но для первого учебного примера достаточно не вызывать std::stoi на пустой строке
Если нужно сохранить группы, а не все цифры подряд
Иногда задача другая: из строки ab12cd34 нужно получить не 1234, а две группы 12 и 34. Тогда простой сбор в одну строку уже не подходит. Нужно хранить текущую группу и закрывать ее, когда встречается буква или другой символ. Это отдельное расширение задачи, но базовый принцип тот же: один проход по строке и проверка каждого символа
Частые ошибки
Использовать только if без else if
Лучше писать цепочку:
if (...) {
} else if (...) {
} else {
}
Так один символ попадет только в одну группу
Проверять цифры вручную слишком рано
Можно написать:
if (c >= '0' && c <= '9')
Это работает для ASCII-цифр, но std::isdigit лучше показывает намерение кода
Забыть getline
Если строка может содержать пробелы, используйте std::getline, а не std::cin >> text
Мини-задание
Измените программу так, чтобы она считала количество букв и цифр:
int lettersCount = 0;
int digitsCount = 0;
Для строки abc123x должно получиться:
Букв: 4
Цифр: 3
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- Как отделить буквы от цифр в C++: isalpha, isdigit и две строки
- Как получить слово из файла в C++: первое слово, все слова и проверка ошибок
- Получить слово из текста C++: stringstream, позиция слова и поиск
- C++ с нуля: первый файл, переменные и вывод