web-dev-qa-db-ja.com

Cの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");
}

これら3つの機能と混同されているので、誰かが違いを説明できますか?

私の主な問題は、その行をトークン化するファイルがあることです。問題は、ファイル内の単語「原子」をトークン化するときに、トークン化のプロセスを停止する必要があることです。

最初にstrcmp()を試しましたが、残念ながら、ファイルにWordの「原子」が配置されるポイントに達したときに停止せずに継続しましたが、memcmp()またはstrncmp()停止し、満足しました。

しかし、その後、最初の5文字がa、t、o、m、sであり、これらの後に他の文字が続く文字列が1つある場合があると考えました。

残念ながら、上記のコードを使用してWord1を「atomsaaaaa」に、Word2を原子に、memcmp()strncmp()をifステートメントで初期化してテストしたところ、私の考えは正しかった0.一方でstrcmp()はしませんでした。 strcmp()を使用する必要があるようです。

36
und3rd06012

要するに:

  • strcmp nullで終了するC文字列を比較します
  • strncmp nullで終わるC文字列の最大N文字を比較します
  • 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
94
Adam Rosenfield

memcmpはバイト数を比較します。 strcmpなどはstringsと比較します。

両方の文字列が5文字の長さ(およびヌルターミネータを加えたもの)であることを知っているため、この例ではごまかします。ただし、文字列の長さがわからない場合はどうなりますか? 文字列の処理方法を知っているであるため、strcmpは使用しないため、memcmpを使用します。

memcmpは、バイトシーケンスの比較に関するものです。各文字列の長さがわかっている場合は、memcmpを使用して比較できますが、その頻度はどれくらいですか?まれに。多くの場合、文字列比較関数が必要です。なぜなら、文字列とは何か、またそれらを比較する方法を知っているからです。

あなたが経験している他の問題に関しては、あなたの質問とコードからそれは不明です。ただし、strcmpは、memcmpよりも一般的な文字列比較の場合に適しています。

7
Ed S.

strcmp():

  • 2つの変数に格納されている2つの文字列を比較するために使用されます。それらの比較には時間がかかります。そのため、プロセスが遅くなります。

strncmp():

  • 前のものと非常によく似ていますが、この例では、最初のn個の文字のみを比較します。これもプロセスを遅くします。

memcmp():

  • この関数は、メモリを使用して2つの変数を比較するために使用されます。それらを1つずつ比較するのではなく、一度に4文字を比較します。プログラムが速度を気にしすぎている場合は、memcmp()を使用することをお勧めします。
4
Arvind kr

strncmpとmemcmpは、前者がNULLで終了する文字列を処理するという事実を除いて同じです。

1
prashant

Strcmpの場合、文字列になることがわかっているものだけを比較する必要がありますが、バイナリファイルの行を読み取るなど、常にそうであるとは限らないため、memcmpを使用して、 NUL文字は一致しますが、さらに入力の長さをチェックし続けることができます。

1
RAZ_MUH_TAZ