Cordes en C ++, et des tableaux de caractères





строки в С++

Со строками мы с вами работали практически в каждой нашей программе и до этого урока. Точнее со строковыми константамипоследовательностью символов в двойных кавычках. Нам часто приходилось выводить на экран ту или иную информацию. par exemple:

строки в С++

Текст в кавычках и есть строковая константа. Кавычки используются для определения начала и конца строковой константы и её частью не являются.

Достаточно часто необходимо не только печатать какие-то короткие сообщения по ходу программы, а и работать с определённым текстом, хранить его где-то, обращаться к нему и редактировать, nécessité. К строковой константе, рассмотренной выше, мы не сможем обратиться в программе, например для того, чтобы перезаписать её (мы не знаем ни ее имени ни адреса в памяти). Сейчас вы узнаете об одном из способов работы со строками в C++. Позже мы познакомимся ещё с одним способомиспользованием classe chaîne.

Итак о первом: в C++ для хранения строк используют символьные массивы. Это такие же массивы, как мы с вами уже рассматривали в статье о массивах в С++, но хранят они не числовые данные, а символьные. Можно представить символы такого массива расположенными последовательно в соседних ячейках памятив каждой ячейке хранится один символ и занимает один байт. Один байт потому, что каждый элемент символьного массива имеет тип char. Последним символом каждой такой строки является символ \0 (нулевой символ). par exemple:

строки в С++, символьные массивы в С++

Сам текст, включая пробел, состоит из 11-ти символов. Если бы в последней ячейке находилась например . (point), а не нулевой символ \0для компилятора это уже не строка. И работать с таким набором символов надо было бы, как с обычным массивомзаписывать данные в каждую ячейку отдельно и выводить на экран посимвольно (при помощи цикла):

строки в С++, символьные массивы в С++

К счастью в C++ есть куда более удобный способ инициализации и обращения к символьным массивамстрокам. Для этого последним символом такого массива обязательно должен быть нулевой символ \0. Именно он делает набор символов строкой, работать с которой, гораздо легче, чем с массивом символов.

Объявляется строка таким образомсоздаем массив типа carboniser, размер в квадратных скобках указывать не обязательно (его подсчитает компилятор), opérateur = и в двойных кавычках пишем необходимый текст. То есть инициализируем массив строковой константой:

Прописывать нулевой символ не надо. Он присутствует неявно и добавляется в каждую такую строковую константу автоматически. ainsi, при том что мы видим 11 символов в строке, размер массива будет 12, depuis \0 тоже символ и занимает один байт памяти. Займет он последнюю ячейку этого символьного массива. Comme vous pouvez le voir, для вывода строки на экран, suffit de se référer à elle par son nom: cout << str << endl; cout будет выводить на экран символ за символом, пока не встретит в одной из ячеек массива символ конца строки \0 и вывод прервется. Такое обращение для обычного символьного массива (массива без \0) недопустимо. Так как компилятор выводил бы символы на экран даже выйдя за рамки массива, пока не встретил бы в какой-то ячейке памяти символ \0. Можете попробовать подставить в первый пример вместо цикла оператор cout << str << endl; и увидите, что получится. У меня показало вот так:

строки в С++, символьные массивы в С++

Хочу обратить ваше внимание на отличие символьной константы (в одинарных кавычках 'f', '@' ) от строковой константы (в двойных кавычках "F", "@" ). Для первой, компилятором C++ выделяется один байт для хранения в памяти. Для символа записанного в двойных кавычках, будет выделено два байта памятидля самого символа и для нулевого (добавляемого компилятором).

Что если строку должен будет ввести пользователь с клавиатуры? В этом случае необходимо объявить массив типа carboniser с указанием его размера достаточного для хранения вводимых символов, включая \0. Не забывайте об этом нулевом символе. Если вам надо хранить 3 символа в массиве, его размер должен быть на единицу больше – à savoir 4.

строки в С++, символьные массивы в С++

Используя пустые кавычки при инициализации, мы присваиваем каждому элементу массива значение \0. Таким образом строка будет очищена от “déchets” других программ. Даже если пользователь введет название содержащее меньшее количество символов, следующий за названием будет символ \0. Это позволит избежать нежелательных ошибок. В памяти эта строка будет выглядеть так:

строки в С++, символьные массивы в С++

à propos, если допустим перезаписать 11-ю ячейку этого массиваstr[11] = ' 0';

строки в С++, символьные массивы в С++

и отобразить массив на экране, то увидим только purecodecpp не смотря на то, что в ячейках 12, 13, 14 остались храниться символы. Нулевой символ сыграет свою главную роль при выводе на экран и всё, что находится за ним не будет показано.

Поговорим о вводе строк с клавиатуры подробней. le fait, что существуют определённые проблемы о которых надо знать и которые необходимо научиться решать. В следующей программе при вводе строки не всё будет так гладко, как нам хочется:

строки в С++, символьные массивы в С++

Не заморачивайтесь пока над тем, что ввод через gin необходимо производить латиницей. О том как корректно ввести кириллицу будет рассказано в отдельной статье. Ici vous pouvez voir, что цитату мы ввели, но при выводе на экран, видим только первое слово. voici, что мы не можем ввести нулевой символ с клавиатуры, et gin воспринимает пробел, символ новой строки и табуляцию, как конец строки. То есть в нашем случае gin прочитал только первое слово, запятую и автоматически добавил знак конца строки. Остальные введенные данные поместил во входную очередь.

Решается эта проблема просто. В C++ есть функции get() et getline() , которые мы можем использовать вместе с gin. Они похожи, но чаще используется getline(). В этой статье мы не будем рассматривать их отличие. Допишем в нашу программу ввод с getline ():

строки в С++, символьные массивы в С++

vous voyez, что в скобках мы указали для функции два аргументав какой массив считать символы (имя массива) и размер этого массива – rangée 11. Результат нам подходитвсё отобразилось правильно. cin.getline() считывает в массив всю строку включая пробелы и табуляции, пока не произойдет нажатие Entrer или пока не будет превышен размер массива. Символ новой строки в массиве не сохранится, а заменится на нулевой символ.

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

Дополнительно к прочитанному желательно посмотреть видео-урок. Строки с 7-й минуты:

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

Abonnez-vous à de nouveaux articles sur notre site un avis:


Je suis d'accord pour recevoir des messages de purecodecpp.com sur mon e-mail

date
page
Cordes en C ++, et des tableaux de caractères
évaluation
5

15 réflexions sur "Cordes en C ++, et des tableaux de caractères

  1. У меня вопрос. Как я могу перебрать массив, найти в нём символ и дописать возле него такой же. Например пользователь вводит D:\myfolder\ а на выходе должно быть D:\\myfolder\\

    1. Посмотрите видео. Там есть инф, что если для массива выбрали авт определение размера array[], то есть функция sizeof, при помощи кот можно в for перебрать все элементы. pour ( int i=0; je<taille de(tableau); i ++). Дойдете до нужного и вставите. Je pense que, si.

      1. Это неверно:
        1. taille de() résultats занимаемое место массивом в байтах, pour 10 элементного массива char это будет 10, а для такого же массива int это будет 40.
        2. Размер массива можно определить как sizeof( tableau ) / taille de( tableau[ 0 ] ). Но и этотолько в области определения массива (до передачи его куда-то в функцию).
        3. В массив нельзя “insérer” membre, можно только если поштучно раздвинуть по очереди все последующие на 1 вправо, но это сильно накладно.
        4. В string, в отличие от массива, вставить элемент можно.

  2. bonjour. Я так и поняла вопрос, что в строку надо добавить символ. (тема урока ведь строки)

  3. почему-то не работает. ФИО первого студента записывает в переменную, а фио второго даже ввести не дает (сразу перескакивает на № группы)
    Подскажите, что я делаю не так)

    1. le fait, что после ввода данных в последнее поле структуры stud[je].ball[j] в потоке cin остаётся символ ‘\n’. Именно его и считывает метод getline(), не приостанавливая программу, ожидая ввод.
      Нужно добавить cin.get() последней командой во внешнем цикле.

      Дмитрий Белик

    1. Совершенно дикое намерение!
      А что бы вы сами хотели получить в результате?: ‘A’*7это сколько?

  4. Найти произведение и минимальную четную цифру, составляющую неко-
    торое число Х как решить эту задачу?

    1. principalement, в вашей задаче формулировка не корректная!
      Что значитсоставляющую число”? В математике нет понятия составляюшее.

      Как вы сами, для примера, представляете как должно выглядеть решение для конкретного значения X, disons, X=113? Напишите.

      1. То тогда вывести на экран, что нет четного минимального числа в введеном числе

Laisser un commentaire

Placez le code dans les balises: <pre class="lang:c ++ décodage:true ">VOTRE CODE</pré>