В чем разница между 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, но совпадают, и вы можете продолжить проверку дальнейших длин ввода.