Подтвердить что ты не робот

В чем разница между memcmp, strcmp и strncmp в C?

Я написал эту небольшую часть кода в 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 до "atomaaaaa" и word2 для атомов и memcmp() и strncmp() в операторах if, возвращаемых 0.On другой рука strcmp() этого не сделала. Кажется, что я должен использовать strcmp().

4b9b3361

Ответ 1

Короче:

  • 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

Ответ 2

memcmp сравнивает количество байтов. strcmp и аналогичные строки сравнения.

Вы вроде обманываете в своем примере, потому что знаете, что обе строки имеют длину 5 символов (плюс нулевой ограничитель). Однако, что, если вы не знаете длину строк, что часто бывает? Ну, вы используете strcmp, потому что он знает, как обращаться со строками, memcmp нет.

memcmp - все о сравнении байтовых последовательностей. Если вы знаете, как долго каждая строка будет да, вы можете использовать memcmp для их сравнения, но как часто это происходит? Редко. Вам часто нужны функции сравнения строк, потому что... они знают, что такое строка и как их сравнивать.

Что касается любых других проблем, которые вы испытываете, непонятно из вашего вопроса и кода. Будьте уверены, хотя strcmp лучше всего оснащается в общем случае для сравнения строк, чем memcmp.

Ответ 3

зЬгстр():

  • Он используется для сравнения двух строк, хранящихся в двух переменных, для их сравнения требуется некоторое время. И это замедляет процесс.

strncmp():

  • Он очень похож на предыдущий, но в этом он сравнивает первое n количество символов в одиночку. Это также замедляет процесс.

memcmp():

  • Эта функция используется для сравнения двух переменных с использованием их памяти. Он не сравнивает их один за другим, он сравнивает четыре символа за один раз. Если ваша программа слишком обеспокоена скоростью, я рекомендую использовать memcmp().

Ответ 4

strncmp и memcmp являются теми же, за исключением того факта, что бывший позаботится о завершенной NULL строке.

Ответ 5

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