Char c что это

от admin

4.11 – Символы

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

Для хранения символов был разработан тип данных char . Символом может быть одна буква, цифра, знак или пробел.

Тип данных char является целочисленным типом, что означает, что базовое значение хранится как целое число. Подобно тому, как логическое значение 0 интерпретируется как false , а ненулевое значение интерпретируется как true , целое число, хранимое переменной char , интерпретируется как символ ASCII.

ASCII расшифровывается как American Standard Code for Information Interchange (Американский стандартный код для обмена информацией) и определяет конкретный способ представления английских символов (плюс несколько других символов) в виде чисел от 0 до 127 (называемых кодом ASCII или кодовым обозначением). Например, код ASCII 97 интерпретируется как символ ' а '.

Символьные литералы всегда помещаются в одинарные кавычки (например, ' g ', ' 1 ', ' ').

Ниже приведена полная таблица символов ASCII:

Коды 0–31 называются непечатаемыми символами и в основном используются для форматирования и управления принтерами. Большинство из них сейчас устарели.

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

Инициализация переменных char

Вы можете инициализировать переменные типа char , используя символьные литералы:

Вы также можете инициализировать переменные типа char целыми числами, но этого, если возможно, следует избегать.

Предупреждение

Будьте осторожны, чтобы не перепутать символы чисел с целыми числами. Следующие две инициализации не эквивалентны:

Символы чисел предназначены для использования, когда мы хотим представить числа в виде текста, а не в виде чисел и применения к ним математических операций.

Печать переменных типа char

При использовании std::cout для печати переменной типа char , std::cout выводит переменную char как символ ASCII:

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

Мы также можем напрямую выводить символьные литералы:

В результате это дает:

Напоминание

В C++ целочисленный тип фиксированной ширины int8_t обычно обрабатывается так же, как signed char , поэтому он обычно печатается как символ ( char ) вместо целого числа.

Печать переменных char как целых чисел через приведение типов

Если мы хотим вывести char как число вместо символа, мы должны указать std::cout , чтобы он печатал переменную char , как если бы она была целочисленного типа. Один (плохой) способ сделать это – присвоить значение переменной char другой переменной целочисленного типа и напечатать эту переменную:

Однако это довольно коряво. Лучше использовать приведение типа. Приведение типа создает значение одного типа из значения другого типа. Для преобразования между базовыми типами данных (например, из char в int или наоборот) мы используем приведение типа, называемое статическим приведением.

Синтаксис статического приведения выглядит немного забавным:

static_cast принимает значение из выражения в качестве входных данных и преобразует его в любой базовый тип, который представляет новый_тип (например, int , bool , char , double ).

Ключевые выводы

Всякий раз, когда вы видите синтаксис C++ (за исключением препроцессора), в котором используются угловые скобки, то, что между угловыми скобками, скорее всего, будет типом. Обычно C++ работает с концепциями, которым нужен параметризуемый тип.

Ниже показан пример использования статического приведения для создания целочисленного значения из нашего значения char :

Эта программа дает следующий вывод:

Важно отметить, что параметр static_cast вычисляется как выражение. Когда мы передаем переменную, эта переменная вычисляется для получения ее значения, которое затем преобразуется в новый тип. На переменную не влияет приведение ее значения к новому типу. В приведенном выше случае переменная ch по-прежнему является char и сохраняет то же значение.

Также обратите внимание, что статическое приведение не выполняет никакой проверки диапазона значений, поэтому, если вы приведете большое целое число в char , вы вызовете переполнение своей переменной char .

О статическом приведении типов и других типах приведения мы поговорим подробнее в следующем уроке (8.5 – Явное преобразование типов (приведение) и static_cast ).

Ввод символов

Следующая программа просит пользователя ввести символ, а затем печатает его как символ и его код ASCII:

Ниже показан результат одного запуска:

Обратите внимание, что std::cin позволяет вводить несколько символов. Однако переменная ch может содержать только 1 символ. Следовательно, в переменную ch извлекается только первый входной символ. Остальная часть пользовательского ввода остается во входном буфере, который использует std::cin , и может быть извлечена с помощью последующих вызовов std::cin .

Вы можете увидеть это поведение в следующем примере:

Размер, диапазон и символ по умолчанию у переменных char

char определяется C++ всегда размером 1 байт. По умолчанию char может быть со знаком или без знака (хотя обычно он со знаком). Если вы используете переменные char для хранения символов ASCII, вам не нужно указывать знак (поскольку переменные char со знаком и без знака могут содержать значения от 0 до 127).

Если вы используете char для хранения небольших целых чисел (чего не следует делать, если вы явно не оптимизируете используемую память), вы всегда должны указывать, со знаком переменная или нет. signed char (со знаком) может содержать число от -128 до 127. unsigned char (без знака) может содержать число от 0 до 255.

Экранированные последовательности

В C++ есть некоторые символы, которые имеют особое значение. Эти символы называются экранированными последовательностями (управляющими последовательностями, escape-последовательностями). Экранированная последовательность начинается с символа '\' (обратный слеш), за которым следует буква или цифра.

Вы уже видели наиболее распространенную экранированную последовательность: ' \n ', которую можно использовать для вставки символа новой строки в текстовую строку:

Эта программа выдает:

Еще одна часто используемая экранированная последовательность – ' \t ', которая включает горизонтальную табуляцию:

Три других примечательных экранированных последовательности:

  • \' – печатает одинарную кавычку;
  • \" – печатает двойную кавычку;
  • \\ – печатает обратный слеш.

Ниже приведена таблица всех экранированных последовательностей:

Экранированные последовательности

Название Символ Назначение
Предупреждение \a Выдает предупреждение, например звуковой сигнал
Backspace \b Перемещает курсор на одну позицию назад
Перевод страницы \f Перемещает курсор на следующую логическую страницу
Новая строка \n Перемещает курсор на следующую строку
Возврат каретки \r Перемещает курсор в начало строки
Горизонтальная табуляция \t Печать горизонтальной табуляции
Вертикальная табуляция \v Печатает вертикальную табуляцию
Одинарная кавычка \' Печать одинарной кавычки
Двойная кавычка \" Печать двойной кавычки
Обратная косая черта \\ Печатает обратный слеш
Вопросительный знак \? Печатает вопросительный знак
Больше не актуально. Вы можете использовать вопросительные знаки без экранирования.
Восьмеричное число \(число) Преобразуется в символ, представленный восьмеричным числом
Шестнадцатеричное число \x(число) Преобразуется в символ, представленный шестнадцатеричным числом

Вот несколько примеров:

Эта программа напечатает:

Новая строка ( \n ) против std::endl

В чем разница между заключением символов в одинарные и двойные кавычки?

Отдельные символы всегда заключаются в одинарные кавычки (например, 'a', '+', '5'). char может представлять только один символ (например, букву а, знак плюса, цифру 5). Что-то вроде этого некорректно:

Текст, заключенный в двойные кавычки (например, "Hello, world!"), называется строкой. Строка – это набор последовательных символов (и, таким образом, строка может содержать несколько символов).

Пока вы можете использовать строковые литералы в своем коде:

Правило

Всегда помещайте отдельные символы в одинарные кавычки (например, ' t ' или ' \n ', а не " t " или " \n "). Это помогает компилятору более эффективно выполнять оптимизацию.

А как насчет других типов символов, wchar_t , char16_t и char32_t ?

wchar_t следует избегать почти во всех случаях (за исключением взаимодействия с Windows API). Его размер определяется реализацией и не является надежным. Он не рекомендуется для использования.

В качестве отступления.

Англоязычный термин «deprecated» (не рекомендуется) означает «всё еще поддерживается, но больше не рекомендуется для использования, потому что он был заменен чем-то лучшим или больше не считается безопасным».

Подобно тому, как ASCII сопоставляет целые числа 0–127 с символами английского алфавита, существуют и другие стандарты кодировки символов для сопоставления целых чисел (разного размера) с символами других языков. Наиболее известной кодировкой за пределами диапазона ASCII является стандарт Unicode (Юникод), который сопоставляет более 110 000 целых чисел с символами на многих языках. Поскольку Unicode содержит очень много кодовых обозначений, то для одного кодового обозначения, чтобы представить один символ, Unicode требуется 32 бита (кодировка UTF-32). Однако символы Unicode также могут быть закодированы с использованием 16-ти или 8-ми битов (кодировки UTF-16 и UTF-8 соответственно).

char16_t и char32_t были добавлены в C++11 для обеспечения явной поддержки 16-битных и 32-битных символов Unicode. char8_t был добавлен в C++20.

Если вы не планируете сделать свою программу совместимой с Unicode, вам не нужно использовать char8_t , char16_t или char32_t . Юникод и локализация в основном выходят за рамки этих руководств, поэтому мы не будем рассматривать их дальше.

А пока при работе с символами (и строками) вы должны использовать только символы ASCII. Использование символов из других наборов символов может привести к неправильному отображению ваших символов.

Символьный тип данных char . Структура System.Char . Методы структуры System.Char

В.NET Framework тип данных char введен для представления отдельного символа. Каждый символ кодируется в формате Unicode. Формат Unicode предусматривает использование кодовой формы UTF-16, в которой каждый символ представлен 16-битным числовым положительным значением.

Разрядность в 16 бит (а не 8 бит, как было раньше) объясняется тем, что нужно обеспечить представление широких наборов символов в некоторых языках. Например, в китайском языке количество используемых символов невозможно поместить в количество возможных вариантов значений, которые дает 8-битное представление символа.

В языке C# каждое 16-битное значение представлено диапазоном от 0x0000 до 0xFFFF и размещается в структуре System.Char .

Структура System.Char представляет методы, которые группируются по следующим признакам:

  • сравнение объектов типа char ;
  • конвертирование текущего char -объекта в объект другого типа;
  • преобразование регистра символа;
  • определение категории текущего символа.
2. Объявление переменной типа char . Примеры символьных констант типа char

Тип данных char может представлять разные виды символов:

  • символы которые отображаются на клавиатуре;
  • специальные управляющие символы, такие как ‘\n’ , ‘\b’ , ‘\t’ и прочие.

Ниже приведены примеры объявления переменной типа char и использование некоторых символьных констант

3. Как определить код символа типа char . Пример

Чтобы определить код символа типа char нужно реализовать операцию явного приведения типа, как показано ниже.

4. Примеры методов, которые реализованы в структуре типа Char

Тип char есть псевдонимом структуры типа System.Char , которая имеет ряд методов. Ниже перечислены основные из них.

4.1. Метод IsControl() . Определение, есть ли символ управляющим символом

Метод IsControl() определяет, относится ли символ к категории управляющих символов в соответствии с кодировкой Unicode. К управляющим символам относятся ‘\n’ , ‘\t’ , ‘\b’ и прочие. Метод возвращает значение типа bool и имеет две перегруженных реализации.

Общая форма первой реализации метода следующая:

  • c – проверяемый символ. Если символ c есть управляющим, то функция возвращает true .

Общая форма второй реализации метода следующая:

  • s – строка, в которой происходит проверка;
  • index – позиция символа в строке s , для которого осуществляется проверка. Если символ c есть управляющим, то функция возвращает true .

Пример.

4.2. Метод IsDigit() . Определение, есть ли символ цифрой

Метод IsDigit() предназначен для определения того, является ли символ цифрой. Метод имеет две перегруженных реализации:

  • c – проверяемый символ;
  • s – строка, в которой проверяется символ в позиции index . Указанный символ имеет обозначение s[index] .

Если указанный символ есть цифрой, то функция возвращает true .

Пример.

4.3. Метод IsLetter() . Определение, есть ли символ буквеным

Метод IsLetter() возвращает true , если заданный символ есть буквеным. Символ задается одной из двух перегруженных реализаций метода

Пример.

4.4. Метод IsLower() . Определение, находится ли символ в нижнем регистре

Метод IsLower() возвращает значение true , если заданный символ находится в нижнем регистре. Метод имеет две перегруженных реализации

  • c – проверяемый символ;
  • s – строка, в которой определяется символ в позиции index .

Пример.

4.5. Метод IsUpper() . Определение, находится ли символ в верхнем регистре

Метод IsUpper() предназначен для определения, находится ли символ в верхнем регистре. В этом случае метод возвращает true . Метод имеет две перегруженных реализации

  • c – проверяемый символ;
  • s – строка, в которой проверяется символ в позиции index . Проверяемый символ имеет значение s[index] .

Пример.

4.6. Метод IsNumber() . Определение, есть ли символ числом

Метод IsNumber() определяет, есть ли символ числом. Если символ есть числом, метод возвращает true . Метод имеет две перегруженных реализации:

  • c – проверяемый символ;
  • s – строка, в которой находится проверяемый символ. Позиция символа задается параметром index .

Пример.

4.7. Метод IsSeparator() . Определяет, если ли символ разделителем

Метод IsSeparator() используется для определения того, относится ли символ к категории разделителей в соответствии с кодировкой Unicode. Если символ есть разделителем, то метод возвращает true .
Метод имеет две перегруженных реализации:

  • c – проверяемый символ;
  • s – строка, в которой в позиции index получается символ, который нужно проверить.

Пример.

4.8. Метод IsWhiteSpace() . Определяет, есть ли символ пробелом

Метод IsWhiteSpace() определяет, относится ли символ к категории пробельных символов в соответствии с кодировкой Unicode. К пробельным символам можно отнести пробел, символ табуляции, символ новой строки и т.п. В случае успеха метод возвращает true .

Существует две реализации метода:

  • c – символ, который проверяется;
  • s – строка, в которой в позиции index определяется символ, который проверяется. Значение символа определяется как s[index] .

Пример.

4.9. Метод ToLower() . Переводит символ в нижний регистр

Метод ToLower() используется для перевода символа в нижний регистр (если возможно). Метод возвращает преобразованный символ. В соответствии с документацией .NET Framework метод имеет две перегруженных реализации

  • c – символ, который переводится в нижний регистр;
  • culture – информация о культуре, которая размещается в классе System.Globalization.Culture . Культура описывает имена для культуры, систему записи, используемый календарь, порядок сортировки а также форматирование для строк и дат.

Пример.

4.10. Метод ToUpper() . Переводит символ в верхний регистр

Метод ToUpper() предназначен для перевода указанного символа в верхний регистр (если возможно). Если преобразование возможно (символ имеет представление в двух регистрах), метод возвращает символ в верхнем регистре. Если невозможно выполнить преобразование, то возвращается значение исходного символа. В соответствии с документацией .NET Framework метод имеет две перегруженных реализации:

Урок №35. Символьный тип данных char

Хоть тип char и относится к целочисленным типам данных (и, таким образом, следует всем их правилам), работа с char несколько отличается от работы с обычными целочисленными типами.

Тип данных char

Переменная типа char занимает 1 байт. Однако вместо конвертации значения типа char в целое число, оно интерпретируется как ASCII-символ.

ASCII (сокр. от «American Standard Code for Information Interchange») — это американский стандартный код для обмена информацией, который определяет способ представления символов английского языка (+ несколько других) в виде чисел от 0 до 127. Например: код буквы ‘а’ — 97, код буквы ‘b’ — 98. Символы всегда помещаются в одинарные кавычки.

Таблица ASCII-символов:

Символы от 0 до 31 в основном используются для форматирования вывода. Большинство из них уже устарели.

Символы от 32 до 127 используются для вывода. Это буквы, цифры, знаки препинания, которые большинство компьютеров использует для отображения текста (на английском языке).

Следующие два стейтмента выполняют одно и то же (присваивают переменным типа char целое число 97 ):

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

Вывод символов

При выводе переменных типа char, объект cout выводит символы вместо цифр:

Также вы можете выводить литералы типа char напрямую:

Оператор static_cast

Если вы хотите вывести символы в виде цифр, а не в виде букв, то вам нужно сообщить cout выводить переменные типа char в виде целочисленных значений. Не очень хороший способ это сделать — присвоить переменной типа int переменную типа char и вывести её:

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

Синтаксис static_cast выглядит следующим образом:

Оператор static_cast принимает значение из (выражения) в качестве входных данных и конвертирует его в указанный вами <новый_тип_данных> .

Пример использования оператора static_cast для конвертации типа char в тип int:

Результат выполнения программы:

Запомните, static_cast принимает (выражение) в качестве входных данных. Если мы используем переменную в (выражении) , то эта переменная изменяет свой тип только в стейтменте с оператором static_cast. Процесс конвертации никак не влияет на исходную переменную с её значением! В вышеприведенном примере, переменная ch остается переменной типа char с прежним значением, чему является подтверждением последний стейтмент с cout.

Также в static_cast нет никакой проверки по диапазону, так что если вы попытаетесь использовать числа, которые будут слишком большие или слишком маленькие для конвертируемого типа, то произойдет переполнение.

Более подробно о static_cast мы еще поговорим на соответствующем уроке.

Ввод символов

Следующая программа просит пользователя ввести символ. Затем она выводит этот символ и его ASCII-код:

Результат выполнения программы:

Input a keyboard character: q
q has ASCII code 113

Обратите внимание, даже если cin позволит вам ввести несколько символов, переменная ch будет хранить только первый символ (именно он и помещается в переменную). Остальная часть пользовательского ввода останется во входном буфере, который использует cin, и будет доступна для использования последующим вызовам cin.

Рассмотрим это всё на практике:

Результат выполнения программы:

Input a keyboard character: abcd
a has ASCII code 97
b has ASCII code 98

Размер, диапазон и знак типа сhar

В языке С++ для переменных типа char всегда выделяется 1 байт. По умолчанию, char может быть как signed, так и unsigned (хотя обычно signed). Если вы используете char для хранения ASCII-символов, то вам не нужно указывать знак переменной (поскольку signed и unsigned могут содержать значения от 0 до 127).

Но если вы используете тип char для хранения небольших целых чисел, то тогда следует уточнить знак. Переменная типа char signed может хранить числа от -128 до 127. Переменная типа char unsigned имеет диапазон от 0 до 255.

Управляющие символы

В языке C++ есть управляющие символы (или «escape-последовательности»). Они начинаются с бэкслеша ( \ ), а затем следует определенная буква или цифра.

Наиболее распространенным управляющим символов в языке С++ является \n , который обозначает символ новой строки:

First line
Second line

Еще одним часто используемым управляющим символом является \t , который заменяет клавишу TAB, вставляя большой отступ:

First part Second part

Таблица всех управляющих символов в языке C++:

Название Символ Значение
Предупреждение (alert) \a Предупреждение (звуковой сигнал)
Backspace \b Перемещение курсора на одну позицию назад
formfeed \f Перемещение курсора к следующей логической странице
Символ новой строки (newline) \n Перемещение курсора на следующую строку
Возврат каретки (carriage return) \r Перемещение курсора в начало строки
Горизонтальный таб (horizontal tab) \t Вставка горизонтального TAB
Вертикальный таб (vertical tab) \v Вставка вертикального TAB
Одинарная кавычка \’ Вставка одинарной кавычки (или апострофа)
Двойная кавычка \” Вставка двойной кавычки
Бэкслеш \\ Вставка обратной косой черты (бэкслеша)
Вопросительный знак \? Вставка знака вопроса
Восьмеричное число \(number) Перевод числа из восьмеричной системы счисления в тип char
Шестнадцатеричное число \x(number) Перевод числа из шестнадцатеричной системы счисления в тип char

Рассмотрим пример в коде:

Результат выполнения программы:

«This is quoted text»
This string contains a single backslash \
6F in hex is char ‘o’

Что использовать: ‘\n’ или std::endl?

Вы могли заметить, что в последнем примере мы использовали \n для перемещения курсора на следующую строку. Но мы могли бы использовать и std::endl . Какая между ними разница? Сейчас разберемся.

При использовании std::cout, данные для вывода могут помещаться в буфер, т.е. std::cout может не отправлять данные сразу же на вывод. Вместо этого он может оставить их при себе на некоторое время (в целях улучшения производительности).

И \n , и std::endl оба переводят курсор на следующую строку. Только std::endl еще гарантирует, что все данные из буфера будут выведены, перед тем, как продолжить.

Так когда же использовать \n , а когда std::endl ?

Используйте std::endl , когда нужно, чтобы ваши данные выводились сразу же (например, при записи в файл или при обновлении индикатора состояния какого-либо процесса). Обратите внимание, это может повлечь за собой незначительное снижение производительности, особенно если запись на устройство происходит медленно (например, запись файла на диск).

Используйте \n во всех остальных случаях.

Другие символьные типы: wchar_t, char16_t и char32_t

Тип wchar_t следует избегать практически во всех случаях (кроме тех, когда происходит взаимодействие с Windows API).

Так же, как и стандарт ASCII использует целые числа для представления символов английского языка, так и другие кодировки используют целые числа для представления символов других языков. Наиболее известный стандарт (после ASCII) — Unicode, который имеет в запасе более 110 000 целых чисел для представления символов из разных языков.

Существуют следующие кодировки Unicode:

UTF-32 — требует 32 бита для представления символа.

UTF-16 — требует 16 бит для представления символа.

UTF-8 — требует 8 бит для представления символа.

Типы char16_t и char32_t были добавлены в C++11 для поддержки 16-битных и 32-битных символов Unicode (8-битные символы и так поддерживаются типом char).

В чём разница между одинарными и двойными кавычками при использовании с символами?

Как вы уже знаете, символы всегда помещаются в одинарные кавычки (например, ‘а’ , ‘+’ , ‘5’ ). Переменная типа char представляет только один символ (например, буква а , символ + , число 5 ). Следующий стейтмент не является корректным:

Текст, который находится в двойных кавычках, называется строкой (например, «Hello, world!» ). Строка (тип string) — это набор последовательных символов.

What is a char*?

From what I understood, we only apply * onto addresses.

7 Answers 7

It can only hold one char acter!

This is a C-string:

It can hold multiple char acters. Another way to write the above is:

The 0 at the end is called the NUL terminator. It denotes the end of a C-string.

A char* stores the starting memory location of a C-string. 1 For example, we can use it to refer to the same array s that we defined above. We do this by setting our char* to the memory location of the first element of s :

The & operator gives us the memory location of s[0] . Here is a shorter way to write the above:

Another common usage of char* is to refer to the memory location of a string literal:

Warning: This string literal should not be changed at runtime. We use const to warn the programmer (and compiler) not to modify myStringLiteral in the following illegal manner:

This is different from the array s above, which we are allowed to modify. This is because the string literal "test" is automatically copied into the array at initialization phase. But with myStringLiteral , no such copying occurs. (Where would we copy to, anyways? There’s no array to hold our data. just a lonely char* !)

1 Technical note: char* merely stores a memory location to things of type char . It can certainly refer to just a single char . However, it is much more common to use char* to refer to C-strings, which are NUL -terminated character sequences, as shown above.

Mateen Ulhaq's user avatar

The char type can only represent a single character. When you have a sequence of characters, they are piled next to each other in memory, and the location of the first character in that sequence is returned (assigned to test). Test is nothing more than a pointer to the memory location of the first character in «testing», saying that the type it points to is a char.

You can do one of two things:

Or, a few variations on those themes like:

I mention this primarily because it’s the one you usually really want.

The bottom line, however, is that char x; will only define a single character. If you want a string of characters, you have to define an array of char or a pointer to char (which you’ll initialize with a string literal, as above, more often than not).

There are real differences between the first two options though. char *test=. defines a pointer named test , which is initialized to point to a string literal. The string literal itself is allocated statically (typically right along with the code for your program), and you’re not supposed to (attempt to) modify it — thus the preference for char const * .

The char test[] = .. allocates an array. If it’s a global, it’s pretty similar to the previous except that it does not allocate a separate space for the pointer to the string literal — rather, test becomes the name attached to the string literal itself.

If you do this as a local variable, test will still refer directly to the string literal — but since it’s a local variable, it allocates «auto» storage (typically on the stack), which gets initialized (usually from a normal, statically allocated string literal) on every entry to the block/scope where it’s defined.

The latter versions (with an array of char) can act deceptively similar to a pointer, because the name of an array will decay to the address of the beginning of the array anytime you pass it to a function. There are differences though. You can modify the array, but modifying a string literal gives undefined behavior. Conversely, you can change the pointer to point at some other char s, so something like:

. is perfectly fine, but trying to do the same with an array won’t work (arrays aren’t assignable).

Читать:
Как разделить элементы списка python

Похожие статьи