В чем разница между 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(), оно остановилось, и я был счастлив.

Но потом я подумал,А что,если будет случай,когда есть одна строка,в которой первые 5 букв-это a, t, o, m, s, и за ними следуют другие буквы.

К сожалению, мои мысли были правильными, когда я проверил его, используя приведенный выше код, инициализируя word1 в "atomsaaaa" и word2 в atoms и memcmp() и strncmp() в операторах if возвращают 0.С другой стороны strcmp() этого не произошло. похоже, что я должен использовать strcmp().

5 33

5 ответов:

Короче говоря:

  • strcmp сравнивает строки C с нулевым окончанием
  • strncmp сравнивает не более N символов нулевых строк C
  • memcmp сравнивает двоичные байтовые буферы из 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().

Strncmp и memcmp одинаковы, за исключением того, что former заботится о нулевой конечной строке.

Для strcmp вы захотите сравнить только то, что вы знаете, что это будут строки, однако иногда это не всегда так, например, чтение строк двоичных файлов, и там вы захотите использовать memcmp для сравнения определенных строк ввода, которые содержат символы NUL, но совпадают, и вы можете продолжить проверку дальнейших длин ввода.