Лекция 10

Работа с текстом. Инициализация массивов.

Массивы целых или вещественных чисел можно инициализировать следующим образом:

int ar1[10] = { 1, 5, -2, 3};

double ar2[15] = { -2.1, 5.23, 56.191 };

Первые ячейки массивов заполняются указанными константами.

Если используется инициализация, то размер массивов может быть не указан явно:

int ar3[] = { 1, 5, -2, 3};

double ar4[] = { -2.1, 5.23, 56.191 };

В этом случае размер массива определяется по количеству элементов в списке иинициализации, то есть в массиве ar3 четыре элемента, а в массиве ar4три.

Кроме типов целого и вещественного числа, в языке C имеется тип символа: char.

Массив символов можно инициализировать аналогично массивов других типов:

char str1[] = { 'A', 'B', 'C', 'D', 'E' };

Массив str1 содержит 5 элементов: коды символов 'A', 'B', 'C', 'D', 'E' в кодировке ASCII.

Nакже массивы символов можно инициализироваться строковыми константами:

char str2[] = “ABCDE”;

В этом случае размер массива str2 6 символов, так как строковые константы содержат на конце дополнительный байт со значением, равным 0. Этот байт часто используется в библиотечных функциях для определения конца строки.


Пример 1. Копирование строки символов. Функция strcpy() копирует строку src в dst и возвращает адрес dst:

char *strcpy(char *src, char *dst) {

char *p = dst;

while (*(dst++) = *(src++)); /* Копировать символ из src в dst пока не скопирован 0 */

return p;

}


Пример 2. Сравнение двух строк. Функция strcmp() возвращает отрицательное число, если строка str1 меньше str2, положительное число, если str1 больше str2, и 0, если строки равны:

int strcmp(char *str1, char *str2) {

while (*str1) { /* Пока не конец строки str1 */

if (*str1 < *str2) /* Если очередной символ строки str1 меньше *.

/* соответствующего символа строки str2 */

return -1; /* результат := меньше

if (*str1 > str2) /* Если очередной символ строки str1 больше */

/* соответствующего символ строки str2 */

return 1; /* результат := больше */

}

if (*str2 == 0) /* Если строка str2 тоже кончилась */

return 0; /* результат := строки равны */

else /* Иначе */

return -1; /* результат := меньше */

}


Битовые операции

В языке C имеются операторы, действующие на битах своих операндов:

& - битовое «и»

| - битовое «или»

^ - битовое «исключающее или»

~ - битовое «не»

<< - сдвиг битов влево на заданное количество мест (в сторону старших битов; старшие биты теряются, младшие заполняются нулями)

>> - сдвиг битов вправо на заданное количество мест (в сторону младших битов; младшие биты теряются, старшие заполняются нулями)


Пример 3. Подсчет суммы битов в целом числе.

int x;

int mask = 1;

int res = 0;

while (mask) {

if (x & mask)

++res;

mask <<= 1;

}


Пример 4. Циклический сдвиг битов целого числа на одно место вправо: младший бит переходит в старший.

int x;

int mask = x & 1; /* Сохраним значение младшего бита числа */

x >>= 1;

while (mask << 1) { /* Пока сохраненный младший бит не дошел до старшего места */

mask <<= 1; /* сдвигаем его влево */

}

x |= mask; /* Присвоим старшему биту значение младшего бита */