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

Теоретические сведения

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

Символьные строки представляют один из наиболее полезных и важных типов данных языка Си. Символьная строка является массивом типа 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 ссылается на ячейку памяти, содержащую ‘а’, и с которой начинается вывод строки.

Функции над строками

В языке Си существует много функций работы над строками. Рассмотрим некоторые из них.

1.3.1. Функция strlen (str) вычисляет длину строки. Тип результата unsigned (беззнаковый).

1.3.2. Функция strcat (str1, str2) приписывает строку str2 к строке str1, и это объединение становится новой первой строкой. Функция strncat (str1, str2, kol) приписывает kol символов строки str2 к строке str1. Например,

main ()

{ static char str1[ ] = “СТРОКА”;

char *str2 = “_СИМВОЛОВ”;

strcat (str1, str2);

puts (str1);

strncat (str1, str2, 3);

puts (str1);

}.

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

СТРОКА_СИМВОЛОВ
СТРОКА_СИМ

1.3.3.Функция strcpy (str1, str2) копирует строку str2 в строку str1.

Пример.

main ()

{static char str1[ ]=”СТРОКА”;

char *str2=”СИМВОЛОВ”;

strcpy (str2,str1);

puts (str2);

strncpy (st1,st2,3);

puts (st1);

}.

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

СТРОКА

СИМОКА

При работе strcpy информация из str1 скопировалась в str2. Строка, куда копируется информация, должна быть не меньше той строки, из которой информация копируется. Функция strncpy скопировала 3 первых символа из строки st2 в строку st1. Но поскольку признак конца строки стоит после буквы А, будет получен приведенный выше результат. Если требуется закончить строку на трех скопированных символах, то необходимо после третьего символа (по счету он будет вторым, т.к. отчёт начинается с нуля) поставить признак конца строки. Для этого в программу перед последним puts требуется ввести оператор st1[3]=’\0’;

1.3.4. Функция strchr (str,c) находит в строке str первое вхождение символа, определяемое параметром С. Функция strrchr (str,c) находит в строке str, последнее вхождение символа, определяемое параметром С.

Пример,

main ()

{static char st1[ ] = ”СТРОКА”;

char *ptr, c =’p’

ptr =strchr (st1,c);

if (ptr)

printf(“%d”,ptr-st1);

else

printf (“нет символа”);

}.

В результате работы программы будет выведено число 2. Символ ‘р’ стоит на втором месте, т.к. отсчёт начинается с нуля.

Переменной С присвоено значение символа, который должен быть найден в строке. Указатель ptr после выполнения функции strchr получает либо значение адреса, где содержится искомый символ, либо его значением становится NULL, если символ не найден. Поскольку st1 является адресом первого символа строки, то ptr-st1 покажет местоположение символа в строке. Функция strrchr работает аналогично функции strchr.

1.3.5.Функция strpbrk(str1,str2) находит в строке str1 первое появление любого из множества символов, входящих в строку str2.

Пример,

main ()

{ static char st1[ ]=”СТРОКА”;

char *ptr;

char *st2 = ”рок”;

ptr = strpbrk (st1,st2);

if (ptr)

printf (“%d”,ptr-st1);

else

printf (“нет символов”);

}.

Результатом работы программы будет число 2.Эта программа отличается от предыдущей лишь тем, что поиск ведётся, исходя из множества символов инициализированных в нашей программе с помощью указателя st2.

1.3.6. Функция strset (str,c) заменяет все символы строки str на значение, определяемое параметром С.

Функция strnset(str,c,kol) заменяет kol символов строки str на значение, определяемое параметром С.

Пример,

main ()

{ static char st1[ ]=”СТРОКА”;

{ static char st2[ ]=”СИМВОЛ”;

char letter = ’x’;

strset (str1, letter);

puts (str1);

strnset (str2, letter,3);

puts (str2);

}.

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

ХХХХХХ

ХХХВОЛ

1.3.7.Функция strcspn (st1,st2) определяет местоположение символа строки st1, который первым совпал с одним из символов строки st2.

Пример,

main ()

{ static char str1[ ]=”СИМВОЛ”;

{ static char str2[ ]=”ВОЛ”;

int n;

n=strcspn (str1,str2);

printf (“%d”,n);

}.

В результате работы программы будет получено значение переменной n равное трём. Это произошло потому, что первым совпавшим символом в строках str1 и str2 является символ ‘B’, а он стоит на третьем месте (отсчёт начинается с нуля).

Функция strspn (st1,st2) определяет местоположение символа строки st1, который первым не совпал с одним из символов строки st2.

Пример,

main ()

{ char *str1=”1234567890”;

char *str2=”123458”;

int n;

n=strspn (str1,str2);

printf (“%d”,n);

}.

В результате работы программы будет получено значение переменной n, равное пяти. Такой результат получен потому, что первым не совпавшим символом в строках str1 и str2 является символ ‘6’, а он стоит на пятом месте (отсчёт от нуля).

1.3.8. Функция strrev (str) меняет порядок следования символов на противоположный.

Приведём примеры с использованием расмотренных выше функции.

Пример 1.Подсчитать количество символов ‘a’ в строке.

main ()

{char *str;

int n,k,i;

gets (str); /*ввод строки */

n = strlen (str); /* определение количества символов в строке*/

for (k=0, i=0; i<n; i++) /*подсчёт количества символов ‘а’*/

if (str[i]==’a’) k=k+1;

printf (“%d”,k); /*вывод количества символов*/

}.

Пример 2.Решить задачу из примера 8, применив указатель.

main ()

{char *str;

gets (str);

while (*str!=’\0’); /*проверка на наличие конца строки*/

if (*str==’a’) k=k+1; /*подсчёт количества символов ‘а’*/

str++; /*смещение указателя на очередной символ*/

puts(str);

}.

Пример 3. В примере демонстрируется вывод разных частей строки.

main ()

{static char st [ ] = “До встречи”;

char *ptr;

ptr = st;

puts (str); /* вывод строки*/

puts (++ptr); /* смещение указателя на первый символ строки и вывод строки*/

st [ 7 ] = ‘ \0 ’; /* признак конца строки помещается на место седьмого символа строки */

puts (st); /* вывод получившейся строки */

puts (++ptr); /* смещение указателя с первого символа нп второй и вывод строки*/

}.

В результате работы программы будет выведена следующая информация:

До встречи

о встречи

до_встр

_встр

Пример 4.

main ()

{static char st [ ] = “ СТРОКА ”;

char *ptr;

ptr = st + strlen (st); /* установка указателя на конец строки*/

while (-- ptr >-=st) /* смещение указателя с первого символа на второй и вывод строки*/

puts (ptr);

}.

Результат работы программы:

А

КА

ОКА

РОКА

ТРОКА

СТРОКА

Пример 5. Определить первый пробел в строке и вывести строку с этой позиции и до конца. Если нет ни одного пробела, то выдать об этом сообщение.

main ()

{ char *st;

gets (st); /* ввод строки*/

while (st! = ‘_’ &&*st! = ‘\0’)

st++; /* останавливается на первом пробеле или нуль-символе*/

if (st == ‘\0’)

printf (“нет пробела”);

else

puts (st);

}.

Задание

Задание взять из таблицы согласно варианту и написать программу.

Номер вар-та В Задание
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Объединить обе строки и поменять местами второе и третье слова.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Скопировать пять символов второй строки в первую. Получить из измененной первой строки новую, в которой не будет последнего и предпоследнего слов.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать первое слово второй строки к первой. Получить из измененной первой строки новую, в которой не будет первого слова.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить первое вхождение символа “м” в строке и вывести строку, начиная с этой позиции и до конца. Если такого символа в строке нет, то удалить второе слово и вывести получившуюся строку.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить последнее вхождение символа “р” в строке и вывести строку, начиная с первого символа и до последнего “р” в строке. Если такого символа нет, то вывести всю строку, исключив из нее последнее слово.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Если последнее слово больше предпоследнего, то заменить первые пять символов буквой “а”, в противном случае все символы заменить на “*”.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Если второе слово первой строки такое же, как второе слово второй строки, то поменять порядок следования символов первой строки на противоположный, в противном случае заменить все символы второй строки на “!”
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым совпал с одним из символов второй. Вывести первую строку, исключив из нее слово, в которое входит этот символ. Вторая строка пробелами не разделена.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с одним из символов второй строки. Вывести слово, в которое входит этот символ.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать три символа второй строки к первой. Поменять местами в измененной первой строке первое и последнее слово.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить первое вхождение символа “d” в строке и вывести слово, в котором оказался этот символ. Если такого символа нет, то изменить порядок следования символов на противоположный.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым совпал с одним из символов второй строки. Приписать ко второй строке часть первой, начиная с этого символа. Если этого совпадения не произойдет, то все символы второй строки заменить нулями.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Определить местоположение символа первой строки, который первым не совпал с одним из символов второй строки. Выделить слово, в которое входит эото символ, и приписать его ко второй строке.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Приписать второе слово второй строки к первой. Поменять порядок следования символов первой строки на противоположный.
  Заданы 2 строки, состоящие из слов, разделенных пробелами. Если первое слово первой строки равно последнему слову второй, то приписать к первой строке первое слово второй, в противном случае вывести вторую строку, исключив из нее последнее слово.

Литература

1. Подбельский В.В. Язык Cu ++: Учебное пособие. - М.: Финансы и статистика,1995, - 560 с.

2. Страуструп Б. Язык программирования Сг ++. - М.: Радио и связь, 1991. - 352 стр.

3. Собоцинский В.В. Практический курс Turbo Cu ++. Основы объктно- ориентированного программирования. - М.: Свет, 1993. - 236 с.

4. Романов В.Ю. Программирование на языке Cu ++. Практический подход. - М.: Компьтер, 1993. - 160 с.

5. Уинер Р. Язык турбо Cu. - М.: Мир, 1991. - 384 с.

6. Юлин В.А., Булатова И.Р. Приглашение к Cu. - Мн.: Высш. Шк., 1990,- 224 с.

7. Котлинская Г.П., Галиновский О.И. Программирование на языке Cu. -Мн.: Высш. Шк., 1991. - 156 с.


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



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