C троковые данные в С. Библиотечные функции для их обработки.
В языке Си отдельного типа данных «строка символов» нет. Работа со строками реализована путем использования одномерных массивов типа char, т.е. строка символов – это одномерный массив символов, заканчива-ющийся нулевым байтом. Нулевой байт – это байт, каждый бит которого равен нулю, при этом для нулевого байта определена символьная константа ´\0´ (признак окон-чания строки, или «нуль-символ»). Поэтому если строка должна содержать k символов, то в описании массива размер должен быть k+1. По положе-нию нуль-символа определяется фактическая длина строки. Например, char s[7]; – означает, что строка может содержать не бо-лее шести символов, а последний байт отводится под нуль-символ. Отсутствие нуль-символа и выход указателя при просмотре строки за ее пределы – распространенная ошибка при работе со строками. Строку можно инициализировать строковой константой (строковым литералом), которая представляет собой набор символов, заключенных в двойные кавычки. Например: сhar S[ ] = “Работа со строками”; для данной строки выделено и заполнено 19 байт – 18 на символы и 19-й на нуль-символ. В конце строковой константы явно указывать символ ´\0´ не нужно. Компилятор добавит его автоматически. Символ ´\0´ нужно использовать явно тогда, когда символьный мас-сив при декларации инициализируется списком начальных значений, например, следующим образом: char str[10] ={‘V’ , ‘a’, ‘s’, ‘j’ , ‘а’, ‘\0’}; или когда строка формируется посимвольно в коде программы. Пример такого формирования приведен в конце этого раздела. При работе со строками можно пользоваться указателями, напри-мер: char *x; x = "БГУИР"; x = (i>0) ? "положительное" : (i<0) ? "отрицательное" : "нулевое"; Такая декларация строки – единственный случай, когда в коде про-граммы можно использовать операцию присваивания явно. Операция char *str = "БГУИР" создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно, причем это касается не только адреса ОП, но и его размера. Знак равен-ства перед строковым литералом означает инициализацию, а не присваи-вание. Операция присваивания одной строки другой в языке Си не опреде-лена (поскольку строка является массивом) и может обрабатываться при помощи оператора цикла (с использованием стандартной библиотечной функций). Процесс копирования строки s1 в строку s2 имеет вид char s1[25], s2[25]; for (int i = 0; i <= strlen(s1); i++) s2[i] = s1[i]; Длина строки определяется с помощью стандартной функции strlen, которая вычисляет длину, выполняя поиск нуль-символа (прототип функ-ции приведен ниже). Таким образом, строка фактически просматривается дважды. А вот следующие действия будут ошибочными: сhar s1[51]; s1 = ”Minsk”; Это связано с тем, что s1 – константный указатель и не может использо-ваться в левой части операции присваивания. Большинство действий со строковыми объектами в Си выполняются при помощи стандартных библиотечных функций, так, для правильного выполнения операции присваивания в последнем примере необходимо ис-пользовать стандартную функцию strcpy(s1, ”Minsk”); Напомним, что для ввода строк, как и для других объектов про-граммы, обычно используются две стандартные функции: Функция scanf вводит значения для строковых переменных при по-мощи формата (спецификатора ввода) %s до появления первого символа “пробел” (символ «&» перед ID строковых данных указывать не надо); Функция gets осуществляет ввод строки, которая может содержать пробелы. Завершается ввод нажатием клавиши Enter. Обе функции автоматически ставят в конец строки нулевой байт. Вывод строк производится функциями printf или puts до нулевого байта. Функция printf не переводит курсор после вывода на начало новой строки, а puts автоматически переводит курсор после вывода строковой информации в начало новой строки. Например: Остальные операции над строками, как уже отмечалось ранее, вы-полняются с использованием стандартных библиотечных функций, декла-рация прототипов которых находятся в файле string.h. Приведем наиболее часто используемые стандартные строковые функции. Функция strlen(S) возвращает длину строки (количество символов в строке), при этом завершающий нулевой байт не учитывается, например: char *S1 = ”Минск!\0”, S2[] = ”БГУИР–Ура!”; printf(“ %d , %d .”, strlen(S1), strlen(S2)); Результат выполнения данного участка программы: 6 , 10 . Функция strcpy(S1, S2) – копирует содержимое строки S2 в строку S1. Функция strcat(S1, S2) – присоединяет строку S2 к строке S1 и поме-щает ее в массив, где находилась строка S1, при этом строка S2 не изменя-ется. Нулевой байт, который завершал строку S1, заменяется первым сим-волом строки S2. Функция int strcmp(S1, S2) сравнивает строки S1 и S2 и возвращает значение <0, если S1<S2; >0, если S1>S2; =0, если строки равны, т.е. со-держат одно и то же число одинаковых символов. Функции преобразования строковых объектов в числовые описаны в библиотеке stdlib.h. Рассмотрим некоторые из них. Преобразование строки S в число: – целое: int atoi(S); – длинное целое: long atol(S); – действительное: double atof(S); при возникновении ошибки данные функции возвращают значение 0. Функции преобразования числа V в строку S: – целое: itoa(V, S, kod); – длинное целое: ltoa(V, S, kod); 2 kod 36, для десятичных чисел со знаком kod = 10. Пример участка кода программы, в котором из строки s удаляется символ, значение которого содержится в переменной с каждый раз, когда он Многомерные массивы string.h Операция sizeof Формат записи: sizeof ( параметр ); параметр – тип или идентификатор объекта (но не ID функции). Данная операция позволяет определить размер указанного парамет-ра в байтах (тип результата int). Если указан идентификатор сложного объекта (массив, структура, объединение), то результатом будет размер всего объекта. Например: sizeof(int) – результат 2(4) байта; double b[5]; sizeof(b) – результат 8 байт * 5 = 40 байт. Динамическое распределение оперативной памяти (ОП) связано с операциями порождения и уничтожения объектов по запросу программы, при котором захват и освобождение памяти производится программно, т.е. в процессе работы программы. При этом в языке Си порождение объ-ектов (захват памяти) и уничтожение объектов (освобождение памяти) вы-полняются при помощи библиотечных функций.
Популярное: Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (188)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |