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

Символьные строки и размещение их в памяти

Тема 9. Работа со строками.

Символьные строки представляют один из наиболее полезных и важных типов данных языка Си. Символьная строка является массивом типа char, который заканчивается нуль – символом (‘\0’). Компилятор автоматически вставляет его после последнего символа строки. При резервировании памяти под строку программист должен предусмотреть один байт для признака конца строки. Например, строка «СТРОКА» будет иметь представление в памяти, показанное на рис.1.

____________________

| С | Т | Р | О | К | А| \ 0 |

____________________

Рис.1.

Всякий раз, когда компилятор встречается с чем-то, заключенным в двойные кавычки, он определяет это как строковою константу. Символы, заключенные в кавычки, плюс завершающий символ ‘\0’, записываются в последовательные ячейки памяти. Строковые константы размещаются в статической памяти.

При определении массива символьных строк необходимо сообщить компилятору требуемый размер памяти. Один из способов сделать это – инициализировать массив пр помощи строковой константы. Так как автоматические массивы нельзя инициализировать, необходимо для этого использовать статические или внешние массивы.

Например,

Static char stroka [ ] = {‘с’, ‘т’, ‘р’, ‘о’, ‘к’, ‘а’, ‘\0’};

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

Static char stroka [ ] = “строка”;

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

char *str;

str = ” строка”;

Это же самое можно записать так:

char *str = “строка”;

Иной путь выделения памяти заключается в явном ее задании. Во внешнем описании мы могли бы указать;

char m1[13] = “одна_строка”;

В этом случае все неиспользованные элементы автоматически инициализируются нуль–символом, как показано на рис.2.

----------------------------------------------

| о | д | н | а | с | т | р | о | к | а | \0 | \0 |

----------------------------------------------

Рис.2.

В лабораторной работе №1 уже упоминалась функция gets (), считывающая строки. Она получает строку от стандартного устройства ввода, которым является клавиатура. Поскольку строка не имеет заранее заданной длины, функция gets () должна знать, когда ей прекратить работу. Функция читает символы до тех пор, пока ей не встретится символ новой строки (‘\n’), который создается при нажатии клавиши Enter. Функция берет все символы до (но не включая) символа новой строки, присоединяет к ним нуль–символ (‘\0’) и передает строку вызывающей программе. Если все идет хорошо, функция gets () возвращает считанную строку. Если что-то неправильно или встретился символ EOF, то она возвращает символ NULL или нулевой адрес.

Рассмотрим пример считывания и вывода строки.

#include < stdio.h >

#include < string.h > /* Подключение файла string.h для работы со строками*/

main ()

{ char name [ 20 ]; /*Выделение памяти*/

gets (name); /*Размещение введенной информации в строку name*/

printf (“%s”, name); /*Вывод строки*/

}.

В приведенном примере для вывода строки использована функция printf (). Для вывода строк чаще всего используют функцию puts (). Разница между функциями состоит в том, что

printf () не выводит автоматически каждую строку текста с новой строки. Если это потребуется, то нужно соответствующее указание. Так,

printf (“%s\n”, string);

дает то же самое, что и

puts (string);

Первый оператор требует ввода большого числа символов и большего времени при выполнении на компьютере. Рассмотрим пример.

#include < stdio.h >

#include < string.h >

main ()

{ static char str1[ ] = “массив инициализирован”;

char *str2 = “Указатель инициализирован”;

puts (str1);

puts (str2);

puts (&str1[4]);

puts (str2+4);

}.

В результате работы получаем:

массив инициализирован

указатель инициализирован

ив инициализирован

атель инициализирован

Обратите внимание на два последних оператора. Указатель &str1[4] ссылается на пятый элемент массива str1. Этот элемент содержит символ ‘и’, и функция puts () использует его в качестве начальной точки. Аналогично str2+4 ссылается на ячейку памяти, содержащую ‘а’, и с которой начинается вывод строки.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: