В чем разница между memcmp, strcmp и strncmp в языке C?
Я написал этот небольшой фрагмент кода на языке Си, чтобы проверить memcmp()
strncmp()
strcmp()
функции в C.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *word1="apple",*word2="atoms";
if (strncmp(word1,word2,5)==0)
printf("strncmp result.n");
if (memcmp(word1,word2,5)==0)
printf("memcmp result.n");
if (strcmp(word1,word2)==0)
printf("strcmp result.n");
}
Может ли кто-нибудь объяснить мне различия, потому что я путаюсь с этими тремя функциями?
Моя главная проблема заключается в том,что у меня есть файл, в котором я маркирую его строку, проблема в том, что когда я маркирую слово "атомы" в файле, я должен остановить процесс маркирования.
Я сначала попробовал strcmp()
но, к сожалению, когда он дошло до того,что слово "атомы" было помещено в файл, оно не остановилось и продолжалось, но когда я использовал либо memcmp()
, либо strncmp()
, оно остановилось, и я был счастлив.
К сожалению, мои мысли были правильными, когда я проверил его, используя приведенный выше код, инициализируя word1
в "atomsaaaa" и word2
в atoms и memcmp()
и strncmp()
в операторах if возвращают 0.С другой стороны strcmp()
этого не произошло. похоже, что я должен использовать strcmp()
.
5 ответов:
Короче говоря:
strcmp
сравнивает строки C с нулевым окончаниемstrncmp
сравнивает не более N символов нулевых строк Cmemcmp
сравнивает двоичные байтовые буферы из N байтИтак, если у вас есть эти строки:
const char s1[] = "atoms\0\0\0\0"; // extra null bytes at end const char s2[] = "atoms\0abc"; // embedded null byte const char s3[] = "atomsaaa";
Тогда эти результаты справедливы:
strcmp(s1, s2) == 0 // strcmp stops at null terminator strcmp(s1, s3) != 0 // Strings are different strncmp(s1, s3, 5) == 0 // First 5 characters of strings are the same memcmp(s1, s3, 5) == 0 // First 5 bytes are the same strncmp(s1, s2, 8) == 0 // Strings are the same up through the null terminator memcmp(s1, s2, 8) != 0 // First 8 bytes are different
memcmp
сравнивает число байт.strcmp
и тому подобное сравнение строк.Вы как бы обманываете в своем примере, потому что знаете, что обе строки имеют длину 5 символов (плюс нулевой Терминатор). Однако что делать, если вы не знаете длину струн, что часто бывает? Ну, вы используете
strcmp
, потому что он знает, как обращаться со строками,memcmp
- нет.
memcmp
Все дело в сравнении последовательностей байтов. Если вы знаете, как длинна каждая строка, то да, вы можете использоватьmemcmp
, чтобы сравнить их, но как часто это происходит? Редко. Вам часто нужны функции сравнения строк, потому что, ну... они знают, что такое струна и как их сравнивать.Что касается любых других проблем, которые вы испытываете, это неясно из вашего вопроса и кода. Будьте уверены, что
strcmp
в общем случае лучше приспособлен для сравнения строк, чемmemcmp
.
Strcmp ():
- он используется для сравнения двух строк, хранящихся в двух переменных, требуется некоторое время, чтобы сравнить их. И это замедляет процесс.
Strncmp ():
- Он очень похож на предыдущий, но в этом он сравнивает только первое число символов n. Это также замедляет процесс.
Memcmp ():
- Эта функция используется для сравнения двух переменных, используя их память. Он не сравнивает их по одному. во-первых, он сравнивает четыре символа одновременно. Если ваша программа слишком озабочена скоростью, я рекомендую использовать memcmp().
Для strcmp вы захотите сравнить только то, что вы знаете, что это будут строки, однако иногда это не всегда так, например, чтение строк двоичных файлов, и там вы захотите использовать memcmp для сравнения определенных строк ввода, которые содержат символы NUL, но совпадают, и вы можете продолжить проверку дальнейших длин ввода.