Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Строки как одномерные массивы данных типа 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.

__________________________________________________________________





Дата публикования: 2015-09-17; Прочитано: 254 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...