Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема7.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
127 Кб
Скачать
☆

1.6. Объединение строк

Сначала простой вопрос – каков результат выполнения следующего кода:

char str1[10]="Hello";

char str2[10]="World!";

char* str3;

str3=str1+str2;

Если ответ – ошибка на этапе компиляции, материал изложенный в статье вы усвоили (или знали это раньше). Если же вы полагаете, что в str3 будет хранится строка "Hello world!", то вероятно, мои предыдущих объяснений оказалось недостаточно. Нельзя складывать указатели (и имена массивов).

Для объединения строк следует использовать функции.

Есть две специальные функции (библиотека string.h):

char* strcat(char* dest, const char* source)

char* strncat(char* dest, const char* source, size_t size)

Эти функции добавляют к строке, на которую указывает dest, символы из строки source. Первая версия добавляет все символы до нуль-терминатора, вторая – максимум size символов. Результирующая строка завершается нуль-терминатором.

Кроме того, можно воспользоваться общей функцией sprintf так:

char str1[]="Hello ";

char str2[]="world";

char str3[]="!";

char str4[13];

sprintf(str4, "%s%s%s", str1, str2, str3);

Этот вариант удобнее, если нужно объединить более двух строк. Однако к его недостаткам относится типонебезопасность.

1.7. Другие функции для работы со строками

Функция

Прототип и краткое описание действий

strchr

char *strchr(char *str, int c);

Ищет в строке str первое вхождение символа с, возвращает указатель на первое вхождение.

strcspn

int strcspn(char *str1, char *str2);

Определяет длину первого сегмента строки str1, содержащего символы, не входящие в строку str2.

strspn

int strspn(char *str1, char *str2);

Определяет длину первого сегмента строки str1, содержащего только символы, входящие в строку str2.

strlwr

char *strlwr(char *str);

Преобразует символы верхнего регистра в строке в соответствующие символы нижнего регистра.

strupr

char *strupr(char *str);

Преобразует символы нижнего регистра в строке в соответствующие символы верхнего регистра.

strset

char *strset(char *str, int c);

Заполняет строку str символом с.

strnset

char *strnset(char *str, int c, int kol);

Заменяет первые kol символов строки str символом с.

strpbrk

int strpbrk(char *str1, char *str2);

Ищет в строке str1 первое появление любого из множества символов, входящих в строку str2.

strrchr

char *strrchr(char *str, int c);

Ищет в строке str последнее вхождение символа с.

strstr

char *strstr(char *str1, char *str2);

Ищет в строке str1 подстроки str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2.

2. Файлы и потоки.

2.1. Понятие файла и потока.

Файлы и их представления. Файлы являются существенной частью современных компьютерных систем. Они используются для хранения произвольной (текстовой, графической, аудио, видео и др.) информации. Файл - это именованный раздел для сохранения информации, обычно раздел на диске. Например, относительно stdio.h можно думать как об имени файла, содержащем некоторую полезную информацию.

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

Библиотека языка С поддерживает три уровня ввода-вывода: потоковый ввод-вывод, ввод-вывод нижнего уровня и ввод-вывод для консоли и портов.

Стандартные файлы. Программы С автоматически открывают три файла. Они имеют названия стандартный ввод (stdin), стандартный вывод (stdout) и стандартный вывод ошибок (stderr). Стандартный ввод - это по умолчанию обычное устройство ввода в системе, как правило, клавиатура. Оба стандартных вывода по умолчанию также представляют собой обычное устройство вывода, как правило, монитор.

Стандартный ввод естественным образом обеспечивает ввод для программ. Этот файл, который читается с помощью функций getchar(), gets(), scanf(). Стандартный вывод - это место, куда направляется обычный вывод программы. При обработке вывода используются функции putchar(), puts(), printf(). Назначение стандартного вывода ошибок заключается в обеспечении логически понятного направления для посылки сообщений об ошибках.

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

Функции С++, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод-вывод. Таким образом, поток - это файл вместе с предоставляемыми средствами буферизации. При работе с потоками можно производить следующие действия:

- открывать и закрывать потоки (т.е. связывать указатели на потоки с конкретными файлами);

- вводить и выводить: символ, строку, форматированные данные, порцию данных произвольной длины;

- анализировать ошибки потокового ввода-вывода и условие достижения конца файла;

- управлять буферизацией потока и размером буфера;

- получать и устанавливать указатель текущей позиции в потоке.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]