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

Как перевести строку в массив символов c

  • автор:

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

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

строки в С++

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

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

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

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

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

Как перевести строку в массив символов c

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

char hello1[] ; char hello2[] ; //

На первый взгляд оба массива имеют один и тот же набор символов, пусть в первом случае это просто набор отдельных символов, а во втором — строка. Но в первом случае — массив hello1 будет иметь пять элементов. А во втором случае массив hello2 будет иметь не 5 элементов, а 6, поскольку при инициализации строкой в символьный массив автоматически добавляется нулевой символ ‘\0’.

Способ определения символьного массива влияет на работу с ним. Так, при выводе на консоль оператор count отобразит всю строку до символа «\0». В конце обязательно должен быть символ ‘\0’, иначе на консоль будут выводится символы из последовательных ячеек памяти, которые содержат мусор, пока не встретится либо нулевой символ, либо не произойдет недопустимый доступ к памяти. Например, сравним вывод трех символьных массивов:

#include int main() < char hello1[]; char hello2[]; char hello3[]; std::cout

Пример консольного вывода:

hello╨J:╕╗☻ hello hello

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

Двухмерные массивы символов

Выше мы рассматривали, что строку можно представить в виде массива символов. Как же тогда нам представить массив строк? Для этого можно использовать двухмерный массив символов:

#include int main() < const int max_length; // максимальная длина строки (включая нулевой байт \0) char langs[][max_length] < "C++", "C#", "Python", "Java", "Kotlin", "Go", "Dart", "PHP" >; std::cout 

Здесь массив langs содержит 8 элементов (8 строк). Максимальное количество символов (условно стобцов) в каждой строке задается с помощью константы max_length . Но непосредственно сами строки массива необязательно должны достигать этой длины. Например, в строке «C++» только четыре символа (3 + автоматически добавляемый нулевой символ). Все остальные элементы получают по умолчанию нулевые значения.

И поскольку каждый элемент массива langs представляет строку, то мы можем получить по индексу нужную строку и вывести на консоль.

Перебор двухмерных символьных массивов

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

#include int main() < char langs[][20] < "C++", "Python", "JavaScript">; for(auto lang : langs) < std::cout >

Здесь при переборе массива langs, каждый его отдельный элемент — массив символов будет помещаться в переменную lang. И далее мы можем вывести этот массив в виде строки на консоль.

Ввод символьных массивов/строк с консоли

Функция getline() потока cin считывает последовательность символов, включая пробелы. По умолчанию, ввод заканчивается, когда считывается символ перевода строки ‘\n’ (например, при нажатии клавиши Enter). Функция getline() имеет две версии. Первая версия принимает два параметра: первый параметра указывает на массив символов для хранения введенных данных, а второй параметр указывает на максимальное количество символов, которое надо сохранить в массив. Это количество включает символ завершения строки — нулевой байт ‘\0’, который автоматически добавляться в конец ввода:

#include int main() < const int max_length ; // максимальное количиство считываемых символов char text[max_length] <>; // массив для считывания строки std::cout << "Enter some text:" << std::endl; // считываем символы, включая пробелы std::cin.getline(text, max_length); std::cout

В данном случае считываем не более 100 символов в массив text. Пример ввода:

Enter some text: Hello METANIT.COM You entered: Hello METANIT.COM

Другая форма функции getline() также принимает третий параметр — символ, который будет выступать сиигналом завершения ввода. Например

#include int main() < const int max_length ; // максимальное количиство считываемых символов char text[max_length] <>; // массив для считывания строки std::cout << "Enter some text:" << std::endl; // считываем символы, включая пробелы std::cin.getline(text, max_length, '!'); std::cout

Здесь в качестве символа окончания ввода выступает восклицательный знак !, поэтому при считывании он не будет включаться в строку:

Enter some text: Hello World! You entered: Hello World

Как преобразовать string в char?

Есть произвольная строка не больше 25 символов. Например «wo1fram»
Как преобразовать ее в массив char[255]?
Чтобы потом с char можно было работать как с полноценным массивом символов, оканчивающимся нуль-символом.

Отслеживать
задан 21 дек 2018 в 13:12
Сава Знатнов Сава Знатнов
43 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
Для этого есть функция-член data()
21 дек 2018 в 13:15

1 ответ 1

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

Тут, видите ли, есть два решения.

Одно — если вам надо только читать эту строку, или там, поменять в ней пару символов — но не менять ее размер (так что всякие strcpy отменяются) — то можно воспользоваться функциями c_str() и data() . Очень рекомендую внимательно почитать описания, а главное — ограничения, накладываемые этими функциями.

И другое — если нужно работать с ней как со строкой в стиле С со всеми возможностями — то просто скопируйте ее в массив, типа

char buf[255]; strcpy(buf,s.c_str()); 
char * buf = strdup(s); 

Отслеживать
ответ дан 21 дек 2018 в 13:36
222k 15 15 золотых знаков 120 120 серебряных знаков 234 234 бронзовых знака

  • c++
  • строки
  • char
  • преобразование
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8466

Как перевести строку в массив символов c

Установить

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.

Курсы Академии Кодебай, стартующие в мае — июне, от команды The Codeby 1. Цифровая криминалистика и реагирование на инциденты 2. ОС Linux (DFIR) Старт: 16 мая 3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая Скидки до 10% Полный список ближайших курсов .

  • Форум
  • Developer Zone
  • Языки программирования
  • C / C++ / C#

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

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