Мегаобучалка Главная | О нас | Обратная связь


C троковые данные в С. Библиотечные функции для  их обработки.



2019-08-13 188 Обсуждений (0)
C троковые данные в С. Библиотечные функции для  их обработки. 0.00 из 5.00 0 оценок




В языке Си отдельного типа данных «строка символов» нет. Работа со строками реализована путем использования одномерных массивов типа 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 байт.

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



2019-08-13 188 Обсуждений (0)
C троковые данные в С. Библиотечные функции для  их обработки. 0.00 из 5.00 0 оценок









Обсуждение в статье: C троковые данные в С. Библиотечные функции для  их обработки.

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

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



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (188)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)