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

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

При написании прошлой статьи по обработке файла мною была использована переменная типа char
У меня, как начинающего еще изучение, сразу возникли некоторые трудности обработки этой переменной. Самый первый вопрос у меня был: — а как вывести переменную char на экран. Почему-то при поиске я натыкался на подробное описание переменной и какие-то мудреные примеры обработки. Хотя меня первым делом интересовало только: «как в C++ вывести на экран переменную, содержащую, например, только одну букву».
Чтобы записать в переменную типа char какое-то нужное значение, используют такое написание кода:

В этом коде объявлена переменная типа A, тип которой есть char. Переменные, тип которых char, называют символьными переменными. Дальше я буду тоже называть ее символьной переменной.

  • Символьная переменная — это числовая переменная, которая используется для представления символов. НЕ путайте с целочисленным типом данных. Это именно символьный тип данных, но числовая переменная. (примечание. Такая интерпретация возможна благодаря тому, что cout умеет распознавать типы)
  • При необходимости компилятор преобразовывает операнд типа char в операнд типа int

Наверняка что-то мудреное сейчас сказал, но не бойтесь, я разъясню.
Переменную типа char используют для представления символов, но компьютер воспринимает её как числовое значение. Сделано так только для нашего удобства. Если бы мы вместо символов использовали числовые коды, то читать наши тексты в исходниках было бы проблематично, поэтому, несмотря на то, что мы вводим (записываем) символ, компьютер его видит как число. Об этом заботится компилятор и думать, как он это делает. на нашем этапе рано. Главное понимать, что тип — это одно, а переменная совсем другое. Символьный тип, но числовая переменная.
Сейчас я покажу еще один пример, который показывает, что Символьный тип данных — это числовая переменная (не очень-то и очевидный, но пример)

Вот здесь такой момент, который часто новичков вводит в заблуждение. «Что это?», «Почему?» «Я же символ 1 записал» и в таком в общем в роде. На самом деле, здесь происходит явное присвоения в символьную переменную числового значения. В символьную переменную ch был записан символ из таблицы ASCII, код которого единица. Таблицу ASCII вы легко найдете в интернете — это таблица символов. Для каждого символа существует свой код. Если будете пробовать с русским языком, то могут возникнуть некоторые трудности, но это такие проблемы кириллицы, на которых я останавливаться не буду. Надеюсь небольшая, но ясная картинка сложилась в вашей голове.
Иногда, чтобы присвоить в символьную переменную какое-то значение используют следующий код

Некоторые новички полагают, что они таким образом присваивают именно символ (символьную константу), но не понимают, что они делают точно. Из-за этого тоже бывает возникают проблемы. Здесь, в таком варианте кода, в символьную переменную ch присваивается первый элемент из символьного массива, который заключен в двойные кавычки. Это важный момент. Двойные кавычки и одинарные кавычки имеют совершенно разные предназначения.

  • Одинарные кавычки '' обозначают, что внутри символ
  • Двойные кавычки "" обозначают, что внутри символьный массив

Чтобы убедиться в верности высказывания о первом символе достаточно попробовать использовать такой код

Когда я стал пробовать работать с символьной переменной как с обычными переменными и написал где-то там внутри кода:

при попытке выполнить программу — мне было объявлено, что в этом месте кода ошибка.
Я стал рыскать, что я делаю не так и нашел много разнообразного материала, но всё почему-то было не то. Возможно я не умею искать, но найденные примеры были очень разнообразны примеры с указателями, различными преобразованиями и хитрыми функциями. Такие примеры мне не нравятся. Простота — вот то, что мне нужно. Признаюсь, что сейчас я отредактировал эту статью и многое уже знаю и смотрю по другому, но это всё то, что со мной действительно происходило. Вот такая ошибка достаточно распространена и вызвана тем, что в символьную переменную идет попытка присвоить массив символов. Можно сказать, что это попытка запихнуть в одну ячейку миллион ячеек. Во первых-это разные типы, а во вторых достаточно трудно впихнуть очень большое во что-то действительно маленькое.

Ближе к теме я могу смело сказать, что всё очень просто:
Привожу пример кода, выводящий на экран введенную букву y

Настолько всё оказалось просто.

Есть немного нестандартная ситуация, которая некоторых новичков может немного напутать. Смотрите код

Возможно, некоторые компиляторы не пропустят, но пропускают достаточно популярные на 2014 год компиляторы. В такой ситуации возьмется самый правый символ из всей последовательности символов. (символ h). Аналогично будет для других похожих записей. Просто не путайте кавычки для символа.

Есть такое дело, что типchar часто используют для создания и обработки массивов каких-то символьных значений. Знакомство с простым массивом было изложено в статье
Одномерный массив в C++ для начинающих

Для работы с массивами часто необходимо использовать циклы. В прошлой статье был использован цикл for. Про который описано в статье
Цикл for в С++ для начинающих

Еще раз продемонстрирую вышеотмеченное, что тип char представляет из себя числовую переменную. Мы ее используем как символ, но компьютер обрабатывает ее как число.

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

То, что я еще не показывал — это тот случай, когда нужно узнать числовое значение какого-то символа. Вот я брал код символа ‘y’, а как быстро его узнать? Очень просто:

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

    Важно знать

  • Присваивание значения в переменную типа char
  • Массив и символ совершенно разные типы данных. Понять и запомнить разницу
  • В символ можно присвоить только символ, но не массив
  • В символьную переменную можно присвоить числовое значение, но присвоится туда символ, не то число, а символ из таблицы ASCII
  • В символ можно присвоить значение из массива путем вытаскивания из массива элемента по индексу или разыменования первого элемента массива (объясню ниже)

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

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

Второй вопрос передо мной встал как — а как обнулить переменную типа char в C++ ?, при поиске я почему-то натыкался на исходник целой функции, которая была написана не самым понятным для новичков языком. На этот вопрос я легко смог ответить, когда понял как такой переменной присваивать значения.
т.е. Если у нас переменная s1равна y, но нам нужно её очистить, то мы это делаем так

Можно еще использовать способы. Но этот способ самый очевидный и запомнить его должно быть достаточно просто.

Так тип char часто используют для работы с массивами, то приведу такой вот пример

мы объявили строку, состоящую из 100 символов, но отсчет тут будет с 0 (нуля), т.е. конечное значение меньше на одну единицу в сравнении с привычным отсчетом.
Напоминаю пример простого массива приведен в одной из прошлых статей Одномерный массив в C++ для начинающих

Есть небольшой нюанс при обработке массива. Так как для обработки массивов используют циклы, то если объявленный нами Массив символов из 100 элементов содержит, например, 5 символов, то неразумно использовать цикл с проходом до самого конца нашего массива. — Потому что если в программе будут тысячи таких операций — это существенно замедлит скорость работы программы.

При объявлении любой переменной, переменной отводится какой-то участок памяти и память эта может уже содержать какое-то значение. Это значение не обязательно пустое, оно не обязательно ноль. Поэтому любые переменные при объявлении правильно обнулять.

Для того, чтобы полностью обнулить массив символов s1, на языке программирования C++ можно описать такой код

Программа обнуления символьного массива

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

Очень часто используют не полное очищение строки, а только частичное. Например, можно обнулить первый элемент символьного массива и мусор из строки на экран выводится не будет, но будет висеть в памяти.

материалы дальше:
Строки String в Borland C++ 3.1 для начинающих
С++ для начинающих Передача символьного массива в функцию
C++ для начинающих Символьный массив
(статья сильно отредактирована 23.01.2014)

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

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

  • Anonymous говорит:

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

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

  • Алексей говорит:

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

  • guest говорит:

    char *s1 = «y»;

  • Was говорит:

  • Денис говорит:

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

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

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

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

  • Infinity говорит:

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

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

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

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

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

  • Программист говорит:

    Здравствуйте! Я прочел вашу статью. Мне было очень грустно и одновременно смешно. Особенно убивает эта ваша фраза: «Так как переменную типа char часто используют как массив, то определяют количество возможных значений». 😆 😆 😆
    Я не смеюсь над вами. Создание сайта это действительно подвиг. Я лишь хочу поддержать вас советом и указать несколько ошибок.

    1. Значение переменной типа char присваивается так:

    char a = 'A';

    Вот здесь:

    char a = *"A";

    происходит разадресация указателя на массив и в результате возвращается значение первого элемента массива т.е. ‘A’

    2. Обнуление происходит так:

    char a = NULL;
    char b[10] = {};

    //А так очищается строка в теле программы

    b[0] = '';

    '' -- этот символ называется ноль-терминатор. Он ставится в конце строки. Вы сами того не зная заполнили этим символом массив s1 из вашей статьи. А ведь можно было присвоить этот символ только нулевому элементу массива.

    3. Смело пользуитесь терминологией.
    Знак = это операция присваивания.
    Знак * операция разадресации.
    Я имею в виду вот этот фрагмент статьи: "Настолько всё оказалось просто, перед знаком = нужно было поставить знак * и нужно было объявить номер элемента (ноль соответствует первому)"

    Поймите меня правильно, статья в нынешнем виде не может существовать. Не поленитесь, перепишите ее.
    На вас лежит большая ответственность! Я серьезно. Страницы вашего сайта попали в первую страницу выдачи Яндекса. Много людей уже начали повторять за вами ошибки.

    Удачи! Вы справитесь!

    Автор сайта отвечает:
    Я это давно знаю, просто трудно перечитывать 200 статей постоянно, чтобы что-то исправить. А некоторые грубые типы так пишут, что даже зная, что лучше исправить, исправлять совсем не охота.
    С вашим char b[10] = {}; Это не обнуление совсем. проверили бы хотя б.
    если говорить о нулевом символе '' ; Я хорошо знал, когда заполнял им строку и цель была в том, чтобы показать настоящее очищение, а не видимое на глаз, ибо в строку входит мусор, который иногда мешает. Вы бы с терминами сами поаккуратнее, "символ нуль-терминации" или просто "нулевой символ", не терминатор))) А символ-терминатор звучит просто круто.

    Статью я модернизирую, но я не буду переходить в чужой стиль. Если я посчитаю, что новичку понятнее так, а не как хочется, то я оставлю именно так. Вы тоже поймите меня правильно. Слово "знак" слабому еще новичку намного проще понять и запомнить чем определение и название каждого знака. В этом нет совсем ошибки, знак он и есть - знак. Меньше акцента на одно дает больше акцента на другое.

    Я буду рад исправить и другие ошибки. поправить неточности, если они выскочат. Я ценю вашу помощь. спасибо.Я это давно знаю, просто трудно перечитывать 200 статей постоянно, чтобы что-то исправить. А некоторые грубые типы так пишут, что даже зная, что лучше исправить, исправлять совсем не охота.
    С вашим char b[10] = {}; Это не обнуление совсем. проверили бы хотя б.
    если говорить о нулевом символе '' ; Я хорошо знал, когда заполнял им строку и цель была в том, чтобы показать настоящее очищение, а не видимое на глаз, ибо в строку входит мусор, который иногда мешает. Вы бы с терминами сами поаккуратнее, "символ нуль-терминации" или просто "нулевой символ", не терминатор))) А символ-терминатор звучит просто круто.

    Статью я модернизирую, но я не буду переходить в чужой стиль. Если я посчитаю, что новичку понятнее так, а не как хочется, то я оставлю именно так. Вы тоже поймите меня правильно. Слово "знак" слабому еще новичку намного проще понять и запомнить чем определение и название каждого знака. В этом нет совсем ошибки, знак он и есть - знак. Меньше акцента на одно дает больше акцента на другое.

    Я буду рад исправить и другие ошибки. поправить неточности, если они выскочат. Я ценю вашу помощь. спасибо.

    Здравствуйте еще раз!
    Хочу пояснить. Термином "ноль-терминатор" (terminator с англ. ограничитель) пользовался мой преподаватель в ВУЗе. Видимо это old school!
    Что касается обнуления строк.
    char b[10] = {}; Это действительно обнуление. Весь массив заполнен нулями. Не верите -- проверьте!
    Если рассматривать строку в её естественном, бытовом смысле, то "пустой" будет та строка в которой нет ни одного символа. Поэтому в 99.9% случаев достаточно поставить в начало нулевой символ. Обычно обработка строки идет до первого нулевого символа а какие символы идут за ним уже не важно. Я понимаю что вы хотели обнулить строку. Просто решил предложить проверенный временем классический вариант.

    Автор сайта отвечает:
    Когда "Обычно обработка строки идет до первого нулевого символа а какие символы идут за ним уже не важно" - да, строка обнуляется
    Если рассматривать "реальное обнуление всех ячеек строки (о котором писал я)" - нет, не обнуление и, даже, первый символ не нулевой. Я этим вариантом проверял. MinGW(CodeBlock) - весь массив отдает символ 'a'
    не думаю, что это повод для споров.

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

    Я проверял Visual Studio 2010 и Dev-C++. Там все правильно работает. Видимо это отличия в реализации компиляторов.

    Автор сайта отвечает:
    Это интересный момент. Вообще "загадка MinGW"
    char
    char
    Как объяснить?
    =====================
    Хотя, оно позднее стало нормально обнуляться, я это признаю, но этот факт имел место быть.

  • Nik говорит:

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

  • Владимир говорит:

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

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

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

  • Сергей говорит:

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

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

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

    • admin говорит:

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

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

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

  • Аноним говорит:

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

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

    • admin говорит:

      Для строки:

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

Ваш e-mail не будет опубликован.

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Пришёл парень на собеседование. Дали ему тест на админа. Он его успешно прошёл и спросил: - А вы всем курьерам такие тесты даёте?

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок