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

Сравнение памяти



Время от времени вам, вероятно, потребуется сравнить два блока данных, невзирая на информацию, кото­рую они содержат. Для этого вызовите функцию memcmp(), объявленную в МЕМ.Н и продемонстрирован­ную листингом 6.13. Эта программа заполняет и сравнивает два символьных буфера; эта операция может быть частью программы сравнения файлов или оказаться полезной для быстрого сравнения байтов.

Листинг 6.13. МЕМСМР.С (сравнение блоков памяти)

1: #include <stdio.h>

2: #include <mem.h>

3:

4: void Report(const char *message);

5:

6: char buffer1[1024];

7: char buffer2[1024];

8:

9: main()

10: {

11: memset(buffer1, 1, sizeof(buffer1));

12: memset(buffer2, 2, sizeof(buffer2));

13: Report("Before merncpy()"),

14: memcpy(buffer2, buffer1, sizeof(buffer2));

15: Report("After memcpy(()");

16: return 0;

17: }

18:

19: void Report(const char *message)

20: {

21: puts("");

22: puts("Comparing bufferi and buffer2");

23: puts(message);

24: if (memcmp(buffer1, buffer2,.sizeof (buffer1)) == 0)

25: puts("Buffers are equal");

26: else

27: puts("Buffers are NOT equal");

28: }

___________________________________________________

Строки 11, 12 заполняют два буфера программы различными значениями - 1 и 2. Как вы видите из этой программы, строка 13 выводит на экран следующее:

Comparing buffer1 and buffer2

Before merncpy()

Buffers are NOT equal

Строка 24 вызывает функцию memcmp(), чтобы сравнить buffer1 и buffer2, причем в качестве третьего ар­гумента функции передается число сравниваемых байтов. Если функция memcmp() возвращает нуль, это значит, что буферы равны, в противном случае они различаются, по крайней мере, одним байтом.

Строка 14 копирует buffer1 в buffer2, делая эти буферы равными. После этого строка 15 сообщит следующее:

Comparing buffer1 and buffer2

After memcpy()

Buffers are equal

Внутренне функция memcmp() сравнивает байты, рассматривая их как беззнаковые значения типа char, и, таким образом, работает почти аналогично функции strcmp(). Функция memcmp() возвращает -1 (или другое отрицательное значение), если символы ее первого аргумента в алфавитном порядке меньше, чем символы в ее втором аргументе, или +1 (или другое положительное значение), если первый буфер в алфавитном порядке больше, чем второй. Вы можете использовать функцию memcmp() для сравнения несимвольных данных толь­ко на равенство.

При сравнении символьных буферов вы можете также использовать функцию memicmp(), которая выпол­няет сравнение символов без учета регистра букв. Параметры функции и результат такие же, как для функ­ции memcmp().

Резюме

• Строка представляет собой массив значений типа char, заканчивающийся нулевым байтом, представлен­ным в программах макроопределением NULL. Если строка не заполняет полностью выделенную для нее память, то байты, находящиеся после завершающего нуля, остаются неиспользованными.

• Строки обычно имеют одну из трех форм: литеральные строки, вводимые непосредственно в текст про­граммы, массивы символов фиксированного размера или указатели типа char *, которые обычно адресуют строки, запоминаемые в куче.

• Нулевая строка не имеет никаких значащих символов, кроме нуля, заполненного в ее первом байте.

• Borland C++ имеет богатую библиотеку строковых функций, таких как strcpy() и strcmp(). Используйте строковые функции для копирования, поиска, сравнения, конкатенации, разложения на подстроки и вы­полнения других операций.

• Для программ, ориентированных только на DOS, включите заголовочный файл CONIO.H и для отображе­ния строк используйте быстрые программы непосредственного вывода в видеобуфер (как например, cputs()). Некоторые функции, например cgets() и cputs(), недоступны для Windows-программ. Для позиционирования курсора вызывайте функцию gotoxy(), а для определения его координат - функции wherex() и wherey(). Чтобы выполнить чтение строк, введенных с помощью клавиатуры, вызовите функ­цию cgets(), которая требует наличия специально подготовленного строкового буфера.

• Многие строковые функции возвращают указатели типа char *, и результат одной функции может переда­ваться другой в качестве аргумента.

• Заголовочный файл МЕМ.Н объявляет прототипы нескольких функций, которые обычно применяются к сим­вольным строкам, но также могут быть использованы как низкоуровневые операции с памятью общего на­значения. Функция memset() заполняет блоки памяти любыми заданными значениями, функции memmove() и memcpy() копируют один блок в другой, а функция memcmp() сравнивает байты в двух блоках.





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



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