Текстовая строка как символьный массив.




Лабораторная работа №6

Работа с указателями. Обработка текстовых данных.

Использование библиотечных функций.

Цель работы:

1. Повторить методы работы с указателями.

2. Применить указатели в задачах по обработке текстов.

3. Изучить использование библиотечных функций в задачах обработки текстов.

4. Продолжить изучение использования пользовательских функций: продолжить изучение работы с функциями, передачи им параметров и возврата значений через указатели и ссылки.

 

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

Текстовая строка как символьный массив.

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

В языке С текстовая строка – это специальный массив:

· тип массива char

· в последнем элементе записан признак окончания – нулевой байт.

 

Следует обратить внимание, что в конце текстовой строки пишется не код символа, который на экране выглядит как 0, а байт с нулевым значением.

Для строки предусмотрена специальная, более удобная форма инициализации, хотя инициировать её стандартным путем, подобно числовому массиву, также можно. Мы уже использовали, эту специальную форму инициализации при выводе текста на экран, например в операторе printf("hello,world!\n"). На самом деле этот оператор не что иное, как инициализатор для безымянного массива "hello,world!\n", передаваемого функции printf() в качестве параметра.

Следующий фрагмент кода инициализирует два массива s1 и s2 с одним и тем же значением:

 

char s1[] = { 's', 't', 'r', 'i', 'n', 'g', '\n', '\0' }; // стандартная инициализация

char s2[] = "string\n"; // специальная инициализация

 

Передав эти массивы в качестве форматных строк функции printf(), вы можете убедиться, что оба вызова напечатают одно и то же.

/* В обоих случаях печатается слово string и перевод на следующую строку*/

printf(s1);

printf(s2);

Обратите внимание - при втором способе нам не пришлось добавлять в конец нулевой байт - он добавляется автоматически.

При работе со строками в качестве ограничителя удобен именно нуль, поскольку его код не соответствует ни одному "печатному" символу, а при использовании в логических условиях означает FALSE.

Пример 1: Вычисление длины строки (работа с индексом).

int len;

char str[] = "Small text";

len=0;

while (str[len]!=0)

len++;

printf("\nдлина строки=%d",len);

Цикл продолжается, пока код очередного символа не равен нулю (ограничителю строки). На выходе из цикла в переменной len получаем длину строки, в эту длину не входит последний нулевой байт, так принято в языке С. Это соглашение следует учитывать, когда вы используете библиотечные функции, которые требуют длину строки в качестве параметра или возвращают её.

 

Другая версия той же программы:

int len;

char str[] = "Small text";

for (len=0; str[len]!=0; len++);

printf("\nдлина строки=%d",len);

Обратите внимание – «точка с запятой» после заголовка цикла указывает на то, что тело цикла отсутствует, поэтому функция printf() выполняется после цикла, а не внутри него!

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

Например, в следующем фрагменте программы граничным значением является число 1111 в массиве с диапазоном значений от 0 до 999.

В примере массив заполняется до тех пор, пока сумма его элементов не превышает k.

Пример 2:

...

const int k= 1500; // максимальная сумма массива

const int col= 5; // число колонок при выводе массива

int dig[1000],*p, s=0,i;

//массив заполняется, пока его сумма не превышает k

for(p=dig; s < k; p++)

{

*p=rand()%1000; // запись элемента массива

s = s + *p; // подсчет суммы массива

}

*p=1111; // запись граничного значения

// Массив печатается до тех пор, пока элемент не равен 1111.

for (i=0,p=dig; *p!= 1111; p++,i++)

{ printf("%d",*p);

if ((i+1)%col) printf("\t");

else printf("\n");

}

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

 

Пример 3: Ввод и отображение строки.

...

char str[60];

int i;

printf("Введите строку: ");

scanf("%s", str);

for (i = 0; i < 60; i++)

printf("%c\n", str[i]);

}

Формат %s функии scanf() позволяет вводить строку символов, ввод заканчивается после нажатия клавиши <ENTER>.

%s рассматривает строку как единое целое, поэтому не требует индексации массива str[], напротив формат %c в функции printf() работает с отдельными символами, поэтому требует перебора элементов строки в цикле с индексацией каждого элемента.

Если в действительности было введено меньше 60-ти символов, элементы массива, следующие за нулевым символом, содержат случайные величины.

 

Обработка текста часто требует анализа и преобразования, как отдельных символов, так и целых строк. В языке С имеется широкий набор библиотечных функций для подобных преобразований.

 




Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: