|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Строки как одномерные массивы данных типа charВ языке Си отдельного типа данных «строка символов» нет. Работа со строками реализована путем использования одномерных массивов типа 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 = "БГУИР" создает не строковую переменную, а указатель на строковую константу, изменить которую невозможно, причем это касается не только адреса ОП, но и его размера. Знак равенства перед строковым литералом означает инициализацию, а не присваивание. Операция присваивания одной строки другой в языке Си не определена (поскольку строка является массивом) и может обрабатываться при помощи оператора цикла (с использованием стандартной библиотечной функций). Процесс копирования строки s 1 в строку s 2 имеет вид char s1[25], s2[25]; for (int i = 0; i <= strlen(s1); i++) s2[i] = s1[i]; Длина строки определяется с помощью стандартной функции strlen, которая вычисляет длину, выполняя поиск нуль-символа (прототип функции приведен ниже). Таким образом, строка фактически просматривается дважды. А вот следующие действия будут ошибочными: сhar s1[51]; s1 = ”Minsk”; Это связано с тем, что s 1 – константный указатель и не может использоваться в левой части операции присваивания. Большинство действий со строковыми объектами в Си выполняются при помощи стандартных библиотечных функций, так, для правильного выполнения операции присваивания в последнем примере необходимо использовать стандартную функцию strcpy (s1, ”Minsk”); Напомним, что для ввода строк, как и для других объектов программы, обычно используются две стандартные функции: Функция scanf вводит значения для строковых переменных при помощи формата (спецификатора ввода) % s до появления первого символа “пробел” (символ «&» перед ID строковых данных указывать не надо); Функция gets осуществляет ввод строки, которая может содержать пробелы. Завершается ввод нажатием клавиши Enter. Обе функции автоматически ставят в конец строки нулевой байт. Вывод строк производится функциями printf или puts до нулевого байта. Функция printf не переводит курсор после вывода на начало новой строки, а puts автоматически переводит курсор после вывода строковой информации в начало новой строки. Например: char Str[30]; printf(“ Введите строку без пробелов: \n”); scanf(“%s”, Str); или puts(“ Введите строку ”); gets(Str); Остальные операции над строками, как уже отмечалось ранее, выполняются с использованием стандартных библиотечных функций, декларация прототипов которых находятся в файле string.h. Приведем наиболее часто используемые стандартные строковые функции. Функция strlen (S) возвращает длину строки (количество символов в строке), при этом завершающий нулевой байт не учитывается, например: char *S1 = ”Минск!\0”, S2[] = ”БГУИР–Ура!”; printf(“ %d, %d.”, strlen(S1), strlen(S2)); Результат выполнения данного участка программы: 6, 10. Функция strcpy (S 1, S 2) – копирует содержимое строки S 2 в строку S 1. Функция strcat (S 1, S 2) – присоединяет строку S 2 к строке S 1 и помещает ее в массив, где находилась строка S 1, при этом строка S 2 не изменяется. Нулевой байт, который завершал строку S 1, заменяется первым символом строки S2. Функция int strcmp (S 1, S 2) сравнивает строки S 1 и S 2 и возвращает значение <0, если S 1< S 2; >0, если S 1> S 2; =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 удаляется символ, значение которого содержится в переменной с каждый раз, когда он встречается char s[81], c; ... for(i = j = 0; s[i]!= '\0'; i++) if(s[i]!= c) s[j++] = s[i]; s[j]='\0'; ... __________________________________________________________________ В режиме консольных приложений в среде Visual C++ 6.0 вывод символов русского языка сопряжен с определенными неудобствами. Разрешение данной проблемы рассматривается в разд. 16.3. __________________________________________________________________ Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |