Краткие теоретические сведения. Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы
Для представления символьной (текстовой) информации можно использовать символы, символьные переменные и символьные константы.
Символьная константа представляется последовательностью символов, заключенной в кавычки: “Начало строки \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>.