Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
В языке Си отдельного типа данных «строка символов» нет. Работа со строками реализована путем использования одномерных массивов типа 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.
__________________________________________________________________
Дата публикования: 2015-09-17; Прочитано: 258 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!