Переменная типа char в C++ для начинающих и как с ней работать

У меня, как начинающего изучение С++, сразу возникли трудности обработки переменной типа char. Самый мой первый вопрос: "А как вывести переменную типа char на экран?".
Несмотря на минимальную потребность: вывести на экран только одну, например, букву, поиск мне выдавал страницы с подробным описанием типа char или с очень мудрёнными кодами.
Сложность у меня возникла из-за того, что я не мог понять, как сохранять отдельный символ в переменную, книг в тот момент у меня не имелось.
Для сохранения переменной типа char используют такой код:

Как вы можете видеть, никакой проблемы, оказывается, и нет. Всё делается очень просто.
Немного объяснений по показанному коду. В этом коде объявлена переменная ch, тип которой есть char. Переменные, имеющие тип char называют символьными переменными. Тут всё логично: тип предназначен для обработки символов, значит все его переменные — символьные переменные. Хотя технически тип char работает с числами: он относится к целочисленным типам, объект cout умеет понимать его как символьный тип. Дальше все переменные типа char я буду называть символьными переменными, чтобы читателю было понятней.
  • Символьная переменная — это числовая переменная, которая используется для представления символов.
Любой отдельный символ, представленный в C++ как char, на самом деле обычное число. Любые операции (сложение, вычитание…), применяемые к обычным целым числам, можно применять к символам char.
Почему C++ выводит число как символ? Это не С++ выводит число как символ, а cout показывает char как символы.

Именно проблема, описываемая в листинге #1, вводила меня в заблуждение, наверняка кого-то вводит ещё. Это характерная ошибка новичков: не указать символьное обозначение сохраняемому значению. Из-за того, что символьные переменные по факту числа, компиляторы С++ никак не противятся сохранению в числовой тип чисел.
  • Чтобы записать в переменную отдельный символ, укутывайте сохраняемый символ в одинарные кавычки.
В С++ одинарные кавычки и двойные кавычки имеют разные предназначения. Одинарные кавычки используют для символов, а двойные кавычки для строк. Это важно.

Бывает, что новичок, плохо знающий основы языка С++, для сохранения в символьную переменную использует код, похожий на вот этот:

Это сработает, но это же жуть. Создаётся видимость сохранения в переменную ch символа 'F', такой код обозначает сохранение первого символа строки "F" в переменную ch. В С++ всегда двойные кавычки обозначают строковое представление, даже один символ, обёрнутый в двойные кавычки, считается строкой.
Пример, демонстрирующий различие:

В моих первых попытках работы с символьной переменной как с обычной переменной моей ошибкой было заключение сохраняемого символа в двойные кавычки:

В один символ не может уместиться настоящая строка, вот и всё объяснение. К тому же строки, заключаемые в исходном коде С++ в двойные кавычки, нельзя просто взять и скопировать в переменную по тем же причинам, что массив нельзя сохранить в переменную.
  • Даже пустая строка в C++ воспринимается компилятором как нечто, содержащее внутри себя много символов, хотя хранится внутри только один символ, признак конца строки

Ошибка происходит из-за разнобоя в типах данных: в char происходит попытка сохранить char[1], компилятор С++ считает, что char[1] слишком большой для char и не даёт возможности такого сохранения.
К сожалению, компиляторы допускают ошибочное написание кодов следующего вида:

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

В листинге #5 показано 3 способа получить числовое представление символьной переменной.
Подводим итоги, эта статья должна была научить вас следующему:

  • Сохранять символы в переменную типа char.
  • В С++ одинарные кавычки используются для символов, двойные для массивов символов.
  • Для символьных переменных массивы слишком велики.
  • Символьные переменные это обычные числа, ASCII коды, которые могут быть представлены людям в виде символов.
  • То, что мы видим числа как символы, следствие работы объекта cout
  • Числовое представление символьных типов легко получать с помощью несложных манипуляций
  • В символ можно присвоить значение из массива путем вытаскивания из массива элемента по индексу или разыменования первого элемента массива (т. е. вытаскивать и сохранять символ), но не сохранять в символ массив.
Моё описание непосредственно типа char в С++ на этом закончено. Не путайте кавычки.

Немного забегу вперёд, покажу кое-что.
Отдельные символы — это, конечно, хорошо, но наиболее востребована работа со строками. В первых версиях С++ работа со строками велась либо при помощи указателей на массив символов, либо просто массива символов.

Язык С++ является надмножеством языка С, поэтому в первых версиях компиляторов С++ со строками приходилось работать как в С. Отсюда название Си-строки или Си-подобные строки. Указатели и массивы тесно связаны между собой, но это разные сущности. При написании строки, оборачиваемой двойными кавычками непосредственно внутри исходного кода программы, говорят, что такая строка константная строка, т. е. её изменять нельзя.

15 комментариев на «“Переменная типа char в C++ для начинающих и как с ней работать”»

  1. Anonymous:

    char s1; s1="y"; можно было так: char s1='у';

    Автор сайта отвечает:
    Да. Это проще и правильнее. Спасибо

  2. Алексей:

    Спасибо, все понятно описано! Буду читать ваш блог

    16
  3. guest:

    char *s1 = «y»;

    14
  4. Was:

    8
    19
  5. Денис:

    ———
    char s1 [100]; //Объявляем переменную s1
    Почти равносилен тому, что мы объявили строку, состоящую из 101 символа.
    Если не понимаете почему 101, а не 100 – лучше изучайте массивы
    ———

    Что значит «почти»? В объявленном массиве 100 элементов, а не 101. «Лучше изучайте массивы» 🙂

    Автор сайта отвечает:
    Ошибся, когда писал. Что ж поделать,
    Трудно что-то исправлять когда сотни тысяч глаз глаз видят страницу, читают её, учат по ней и только спустя годы кто-то говорит, что тут вот ошибка.

    спасибо, что отметили ошибку.

  6. Infinity:

    Когда ты пишешь char s1=»y», то ты присваиваешь переменной типа символ строку! Так как двойные ковычки — это строка, это передача значание y и символа конца строки. Поэтому у тебя и не присваивалось значение.
    А с * у тебя получилось, так как ты присвоил переменной типа чар первый элемент массива.
    Правильно надо было присвоить переменной типа чар только символ, а для этого символ помещается в ОДИНАРНЫЕ кавычки.
    s1=’y’;

    Автор сайта отвечает:
    именно так.
    только один нюанс. В С++ тип char это обычные целые числа. Только в отличии от привычных целочисленных типов данных, он используется для представления символов. Т.е. также правильно как и с одинарными кавычками присваивать в переменную s целое число, которое соответствует нужному символу.

    Максим говорит:
    06.01.2014 в 6:57 пп

    совершенно верно, только ваши методы почесать ухо ногой засунув руки в то место откуда они растут надо удалить и написать единственно правильное решение.
    как присвоить типу чар значение?

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

    10
    10
  7. Nik:

    «…неполное очищение строки, а только частичное.» в конце статьи. Не, вроде, раздельно пишется в слове «неполное». и, кстати, «Максимуочень признателен…» — тут тоже, по-моему, что-то не так…)

  8. Владимир:

    Я не в чём не упрекаю автора. Просто как пользователь Linux таким же пользователям хочу добавить:

    Если вы пишете программу в Linux, то попытка присвоить переменной char символ кириллицы — вызовет ошибку компилятора. Так как символ кириллицы в данной операционной системе есть только в кодировке UTF8 и занимает 2 байта. Которые не смогут влезть в 1 байт отведённый компилятором под переменную типа char.

    В своё время, когда только начинал программировать, я долго не мог найти причину этой ошибки. Так что имейте в виду.

    12
  9. Сергей:

    Здравствуйте. Поясните пожалуйста, почему строка

    присваивает в переменную аски-код единицы, а

    обнуляет символьную переменную, а не прописывает аски-код нуля?

    • Присваивает, просто объект cout проявляет инициативу и выводит значение переменной как тип char. Поэтому 0 превращается в признак конца строки: пустой символ.
      Если первый же символ является признаком конца строки, то строки как бы и нет.

      Если на экран выводить тип переменной в принудительной форме к int, то будет видно, что всё верно.

      ответ был исправлен намного позже, чем был задан вопрос

  10. Аноним:

    Здравствуйте!У меня возникла проблема при чтении текста.

    Как сделать так, чтобы человек ввел буквенное значение и оно записалось?

    10
    • Для строки:

      15
  11. delphin:

    char ch=‘y’;
    cout<<int(ch);

    Так правильно)

  12. Kseniya:

    Спасибо, для начинающих — самое то. Без заумной теории и на «человеческом» языке.

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

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

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/nikolay-sekunov/programmirovanie-na-c-v-linux/?lfrom=15589587
Яндекс.Метрика