Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Время от времени вам, вероятно, потребуется сравнить два блока данных, невзирая на информацию, которую они содержат. Для этого вызовите функцию 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!