Краткие теоретические сведения. Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы

Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы.

Символьная константа представляется последовательностью символов, заключенной в кавычки: “Начало строки \n”. В C/C++ нет отдельного типа для строк. Массив символов - это и есть строка. Количества элементов в таком массиве на один элемент больше, чем изображение строки, т. к. в конец строки добавлен ‘\0’ (нулевой байт или нуль-терминатор).

Работа со строками

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

char s[] = “ABCDEF”;

Функция scanf() может использоваться для чтения строк из потока ввода, для чего надо указать спецификатор формата %s ‑ который заставляет функцию scanf() читать символы, пока не встретится специальный символ. Прочитанные символы помещаются в массив символов, на который указывает соответствующий аргумент, и результат завершается нулевым символом. Применительно к scanf() специальные символы ‑ это пробел, новая строка, табуляция, вертикальная табуляция или перевод формата. Функция scanf() читает строку до первого специального символа. Это означает, что нельзя использовать scanf() для чтения строки типа «this is a test», поскольку первый пробел завершит процесс ввода. Поэтому рекомендуется использовать специальные функции для чтения строк из консоли ‑ gets(), которая читает строку, пока не встретится возврат каретки.

Функция gets() читает строку символов, введенных с клавиатуры и помещает их по адресу, указанному в аргументе. Можно набирать символы, пока не будет нажат ввод. Символ, соответствующий клавише ввод - возврат каретки, - не станет частью строки. Вместо этого в конце строки появится нулевой символ, и gets() закончит работу. Функция gets() возвращает указатель на str. Прмер использования команды gets(0):

char str[80];

gets(str);

Для вывода строки на консоль можно использовать функции printf() и puts. Для использования функции printf необходимо указывать спецификатор формата %s. Функция puts() выводит передаваемый ей аргумент на экран, завершая вывод переходом на новую строку. Примеры использования этих функций:

printf ("Here's your string: %s", str);

puts(str);

Для работы со строками существует специальная библиотека string.h. Примеры функций для работы со строками из библиотеки string.h:

Функция Прототип и краткое описание функции
strcmp int strcmp(const char *str1, const char *str2); Сравнивает строки str1 и str2. Если str1< str2, то результат отрицательный, если str1 = str2, то результат равен 0, если str1> str2, то результат положительный.
strcpy char* strcpy(char*s1, const char *s2); Копирует байты из строки s1 в строку s2
strdup char *strdup (const char *str); Выделяет память и перености в нее копию строки str.
strlen unsigned strlen (const char *str); Вычисляет длину строки str.
strncat char *strncat(char *s1, const char *s2, int kol); Приписывает kol символов строки s1 к строке s2.
strncpy char *strncpy(char *s1, const char *s2, int kol); Копирует kol символов строки s1 в строку s2.
strnset char *strnset(char *str, int c, int kol); Заменяет первые kol символов строки s1 символом с.

Строки, при передаче в функцию, в качестве фактических параметров могут быть определены либо как одномерные массивы типа char[], либо как указатели типа char*. В отличие от обычных массивов в этом случае нет необходимости явно указывать длину строки.

Потоковый ввод-вывод

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

Поток ‑ это файл вместе с предоставленными средствами буферизации. При работе с потоком можно:

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

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

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

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

· получать и устанавливать указатель текущей позиции в файле;

Функции библиотеки ввода-вывода находятся в заголовочном файле <stdio.h>.

Наши рекомендации