Как перевести символ в верхний регистр с
Перейти к содержимому

Как перевести символ в верхний регистр с

  • автор:

Перевод букв русского алфавита в верхний регистр

Задача — перевод букв русского алфавита в верхний регистр. Однако при вводе любой строки, к примеру «привет», на выходе получаю яЁштхЄ . В чём проблема?

Отслеживать
задан 28 ноя 2017 в 17:41
Sergei Mikhailovskii Sergei Mikhailovskii
509 2 2 золотых знака 6 6 серебряных знаков 20 20 бронзовых знаков
А если #include ?
28 ноя 2017 в 17:44
nick_gabpe, все равно нет
28 ноя 2017 в 17:56
А какая у вас кодировкам консоли? Выведите строку до преобразования.
28 ноя 2017 в 19:19

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Во-первых цикл ничего не делает.
В VC++ по умолчанию char имеет максимальное значение 127, и условие string[i] > 192 всегда ложно.

Используйте unsigned char, например

for (int i = 0; string[i]!='\0'; i++) < unsigned char c = string[i]; if (c >192 && c < 255) < string[i] = toupper(c); >> 

(Также в toupper нельзя передавать отрицательные значения.)

А во-вторых яЁштхЄ это вывод исходной строки привет .
Добавьте SetConsoleOutputCP(1251); .
Подробнее тут — Русский язык в консоли

Как перевести символ в верхний регистр с

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

  • 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 символом пунктуации (один из следующих: _ < >[ ] # ( ) < >% : ; ? * + — / ^ & | ~ ! » brush:cpp;»> #include int main() < unsigned char letter ; if (std::isupper(letter)) std::cout

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

    #include #include int main() < std::string text ; std::string phone; // строка для хранения номера for(unsigned i<>; i < text.length(); i++) < // проверяем, является ли символ цифрой if(std::isdigit(text[i])) < // добавляем в строку номера телефона phone += text[i]; >> std::cout 

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

    #include #include int main() < std::string word1 ; word1 = "hello"; std::string word2 ; if(word1 == word2) < std::cout else < std::cout >

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

    strings are not equal

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

    #include #include int main() < std::string word1 ; std::string word2 ; bool is_equal; // равны ли строки 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 else < std::cout >

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

    HELLO and hello are equal

    Язык Си в примерах/Верхний регистр

    Дано текст — последовательность кодов ASCII — на стандартном вводе программы. Последовательность конечна, но ее длина заранее неизвестна. Надо вывести на стандартный вывод исходный текст, заменив в нем строчные буквы латиницы (a, …, z) прописными (A, …, Z). Указание воспользоваться особенностью кодовой таблицы ASCII: коды прописных букв отличаются от кодов соответствующих строчных на постоянную величину (а именно: 32.) Дополнительно предполагая поддержку средой русскоязычной локали, реализуйте аналогичное преобразование для кириллических текстов (используя стандартные функции языка.)

    • 1 Решение
    • 2 Использование стандартной библиотеки
    • 3 Кроме латиницы
    • 4 Задания
    • 5 См. также
    • 6 Примечания

    Решение править

    В следующей программе введенный пользователем текст на латинице переводится в верхний регистр, то есть строчные буквы становятся заглавными. Все прочие коды — включая заглавные буквы и символы, не являющиеся латинскими буквами — не меняются.

    Обратите внимание на то, что с символами (переменными типа char ) можно оперировать как с числами. В частности, ‘Z’ — ‘A’ есть число, равное разности кодов символов A и Z , то есть (при использовании кодовой таблицы ASCII) 25 — число букв в латинском алфавите минус 1. Символы можно также сравнивать друг с другом, при этом сравниваются их коды.

    #include #include int main ()  int c; while ((c = getchar ()) != EOF)  if ('a'  c && c  'z')  c += 'A' - 'a'; > putchar (c); > assert (! ferror (stdin)); return 0; > 

    Главный циклусловие корректности ввода) этой программы почти полностью совпадают с рассмотренными в разделе ASCII коды символов. Однако, вместо использования printf для вывода значений считанных кодов, здесь мы используем функцию putchar для вывода самих кодов (знаков), возможно — после преобразования. [1] В коде по-прежнему используются функции getchar и ferror . [2] [3]

    Обратите внимание, что сформировать условие «конец потока» при вводе с клавиатуры можно вводом (в зависимости от системы и предполагая настройки по-умолчанию) Control-d или Control-z (также обозначаются C-d , ^D , C-z , ^Z .)

    Использование стандартной библиотеки править

    Приведенный выше код можно еще более упростить, если воспользоваться стандартной функцией преобразования регистра toupper , объявленной в заголовке ctype.h . [4]

    Некоторые реализации языка, кроме того, определяют функции strlwr и strupr , которые переводят в нижний и верхний регистр строки, а не отдельные символы. Эти функции, однако, не являются стандартными и их наличие (или отсутствие) зависит от выбранной реализации языка.

    #include #include #include int main ()  int c; while ((c = getchar ()) != EOF)  putchar (toupper (c)); > assert (! ferror (stdin)); return 0; > 

    Кроме латиницы править

    Стандарт предусматривает также ряд средств для поддержки письменностей, отличных от «базовой» (26-символьной) латиницы. В основе такой поддержки — два следующих понятия:

    1. локаль — набор сведений о письменности, языке и культуре, включающий, помимо прочего, таблицы соответствия символов верхнего и нижнего регистров;
    2. широкие символьные типы ( wchar_t , wint_t ; англ. wide character ) — для представления ряда письменностей (например — основанных на иероглифах), а равно для представления текстов на нескольких языках, «байтового» типа char оказывается недостаточно; как следствие, в задачах, связанных с обработкой многоязычных текстов, его заменяет тип wchar_t ; аналогично, в операциях ввода-вывода используется тип wint_t (и константа WEOF .)

    Соответственно, в исходный вариант вносятся следующие изменения.

    1. Появляется вызов setlocale ( LC_ALL , «» ) , инициализирующий локаль в соответствии с текущими настройками. (По-умолчанию, при запуске программы полагается setlocale ( LC_ALL , «C» ) — установка «стандартной» локали.) [5]
    2. Функции getwchar , towupper , putwchar заменяют соответствующие для «узких» символов ( getchar , toupper , putchar .) Соответственно меняются тип ( int → wint_t ) и константа признака исчерпания входного потока ( EOF → WEOF .) [6][7][8]
    3. Включаются соответствующие заголовки ( locale.h , wchar.h , wctype.h .)
    #include #include #include #include #include int main ()  char *rl = setlocale (LC_ALL, ""); assert (rl != 0); wint_t c; while ((c = getwchar ()) != WEOF)  putwchar (towupper (c)); > assert (! ferror (stdin)); return 0; > 

    Отметим, впрочем, что принятые в конкретном языке правила обращения со строчными и заглавными могут оказаться сложнее простой зависимости символ—символ, предполагаемой в данном примере. Так, например, правила немецкого языка ставят в соответствие строчной «ß» пару заглавных — «SS» (например: Straße → STRASSE ), что ни коим образом не может быть реализовано функцией towupper .

    Задания править

    1. Проверьте работу программы вводом строк Hello! и Привет! . Удостоверьтесь, что «базовые» варианты решения выполняют заданное преобразование лишь для первой из них, в то время как «интернационализованное» решение действует и в отношении кириллического ввода.
    2. Разработайте варианты программы, выполняющие (вновь для латиницы) a. преобразование верхнего регистра в нижний и b. «переключение» регистра — Hello! → hELLO! . (Указание: воспользуйтесь стандартными функциями islower и isupper . [9][10] )

    См. также править

    Примечания править

    1. ↑7.21.7.8 The putchar function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    2. ↑7.21.7.6 The getchar function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    3. ↑7.21.10.3 The ferror function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    4. ↑7.4.2 Character case mapping functions (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    5. ↑7.11.1.1 The setlocale function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    6. ↑7.29.3.7 The getwchar function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    7. ↑7.30.3.1.2 The towupper function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    8. ↑7.29.3.9 The putwchar function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    9. ↑7.4.1.7 The islower function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.
    10. ↑7.4.1.11 The isupper function (англ.) WG14 N1570 Committee Draft. ISO/IEC (2011-04-12). Проверено 2012-11-19 г.

    Преобразование в верхний и нижний регистр в C++

    Класс C++ String предоставляет огромное количество встроенных функций для выполнения операций над входной строкой.

    В этом руководстве мы углубимся в преобразование входной строки в нижний и верхний регистр в C++.

    Преобразование строки в верхний регистр

    Язык C++ String имеет встроенную функцию toupper() для преобразования входной строки в верхний регистр.

    Ее синтаксис выглядит так:

    toupper(input_string)

    Взгляните на следующий пример:

    #include #include using namespace std; int main()

    В приведенном выше фрагменте кода пакет cstring содержит функции, связанные со строками. Кроме того, там есть функция strlen(), которая используется для вычисления длины входной строки.

    Метод putchar() необходим для отображения данных на экране/консоли.

    Вывод будет выглядеть так:

    Original String: Engineering Discipline. String in UPPERCASE: ENGINEERING DISCIPLINE.

    Преобразование вводимого символа в верхний регистр

    Преобразовать символы/строки в верхний/нижний регистр можно даже с учетом значений ASCII входных символов.

    • Значения ASCII для строчных букв (a-z): 97–122
    • Для букв верхнего регистра (A-Z): 65–92

    Посмотрим на следующий пример:

    #include using namespace std; int main() < char X; cout>X; X=X-32; cout

    Как видите, разница между ASCII-значениями для строчных и прописных букв составляет 32 (если от 97 отнять 6).

    Следовательно, чтобы преобразовать входные данные в верхний регистр, нам нужно вычесть 32 из значения ASCII вводимого символа.

    Enter a character:f Converted character to UPPERCASE:F

    Преобразование строки в нижний регистр

    Класс C++ String имеет встроенную функцию tolower() для преобразования входной строки в нижний регистр.

    Ее синтаксис выглядит так:

    tolower(input)

    К примеру, такой код:

    #include #include using namespace std; int main()

    Вернет такой результат:

    Original String: Engineering Discipline. String in lowercase: engineering discipline.

    Преобразование вводимого символа в нижний регистр

    Посмотрите на этот пример:

    #include using namespace std; int main() < char X; cout>X; X=X+32; cout

    Как вы уже знаете, разница между значениями верхнего и нижнего регистра составляет 32. Соответственно, нам нужно добавить 32 к значению ASCII входного символа, чтобы преобразовать его в нижний регистр.

    Enter a character:R Converted character to lowercase:r

    Итоги

    В этой статье мы рассмотрели преобразование символов и строк в нижний и верхний регистр в C++. В отношении методов ASCII важно отметить следующее: они просто преобразуют введенные символы в ASCII, а затем обратно. Если строка будет содержать числа, а не только буквы, вы получите неожиданный вывод.

    Чтобы избежать подобных ошибок, вы можете либо обработать входные данные и убедиться, что введенные значения на самом деле являются символами, либо просто использовать функции toupper() и tolower().

    Читайте также:

    • Документация функции Uppercase
    • Документация функции LowerCase
    • Сравнение строк в C++: три основных метода

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *