Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
356
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

10.3.2. Рекомендации по обработке строк

Кратко напомним некоторые особенности обработки строк, хотя все средства языка, необходимые для выполнения заданий со строками, уже были рассмотрены в первых главах пособия.

  1. Определение символьного массива фиксированного размера:

Нельзя размер массива задавать с помощью переменной, т.е. будет ошибкой определение (если N – непрепроцессорный идентификатор):

2. Определение динамического массива:

3. Обращение к элементу массива:

выражения Аrrау[0] и * Array - эквивалентны. Также эквиваленты выражения:

Для динамического массива, адресованного указателем р, эквивалентны выражения:

4. Переход к соседнему (i +1)-му элементу динамического массива:

следующие выражения эквивалентны:

Неверно: Array++[i] - имя массива есть константа, по определению ее нельзя изменять.

5. Варианты перебора элементов массива.

Опасный вариант (можно забыть начало массива):

6. Строки в языке Си "размещаются" в символьных массивах. Признаком окончания строки служит '\0'.

Если определен массив

то в массиве string[ ] длиной 25 байт будет размещена строка длиной в 11 байт и string[0] = = '\0'.

Строки могут быть заданы в программе и так:

7. Для ввода строк (набираемых на клавиатуре) удобно использовать функцию char* gets(char* s), которая размещает введенную последовательность символов в область памяти, адресуемую указателем s. При этом признак конца ввода '\n', добавляемый во входной поток при нажатии клавиши <Enter>, функция gets( ) заменяет признаком конца строки '\0'.

Использование для ввода строк функции scanf("%s"...) не позволяет вводить последовательности символов, в которых содержатся пробелы или обобщенные пробельные символы. Ввод по спецификации %s выполняется до ближайшего пробела.

8. Вычислить длину (len) строки, находящуюся в массиве string или адресуемую указателем char * string; можно так:

Еще более удобно применять функции для работы со строками из стандартной библиотеки. Они описаны в заголовочном файле string.h (см. Приложение 3). Например, для определения длины строки используйте функцию с прототипом unsigned strlen(char *str). (Возвращает длину строки без учета завершающего строку символа '\0'.)

9. Копировать строку из массива string или из строки, адресуемой указателем char * string, в новый массив, адресуемый указателем char * s, можно таким образом:

здесь len - длина исходной строки.

Вариант, смещающий указатель с начала области памяти:

10. Функции с параметрами-строками:

1) применение указателей

2) применение массива

10.3.3. Пример выполнения задания по обработке строк

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

Текст программы:

Пример выполнения программы:

В программе следует обратить внимание на ряд особенностей.

Чтение символов входного потока выполняется двумя разными функциями. В цикле (окончанием которого служит появление символа '\n') с помощью getchar( ) читается последовательность символов в область памяти, адресуемую указателем char* input. Перед этим с помощью функции scanf("%d",&LenMax) считывается значение LenMax. Здесь возникает одно неудобство. Функция scanf( ) при вводе "оставляет" во входном потоке признак '\n' конца вводимой последовательности. Если затем следует ввод с помощью функции getchar( ), то первым считанным значением будет '\n'. Именно поэтому перед циклом с помощью getchar( ) из входного потока удаляется ненужный символ '\n'.

Следующая особенность - отсутствие индексированных переменных. Для доступа к элементам массивов, в которых размещаются символы строк, используются разыменования указателей и выражений с указателями, например: *(*(c+j)+i). В качестве упражнения рекомендуем написать вариант программы с индексированными переменными для доступа к отдельным символам строк.

Еще одна особенность - отсутствие обращений к стандартным функциям для работы со строками. Программу можно упростить, если использовать функции для определения длины строк strlen( ), для копирования строк strcpy( ) и др.