53

この小さなコードをCで記述して、Cでmemcmp() strncmp() strcmp()関数をテストしました。

これが私が書いたコードです:

#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()ましたが、残念ながらファイルに「アトム」という単語が入るところまで止まらず続けましたが、どちらかを使うmemcmp()strncmp()止まって嬉しかったです。

しかし、最初の5文字がa、t、o、m、sで、その後に他の文字が続く1つの文字列がある場合はどうなるか、と思いました。

word1残念ながら、上記のコードを使用して「atomsaaaaa」とアトムword2に初期memcmp()化し、ifステートメントで0を返したので、私の考えは正しかったです。strncmp()一方strcmp()、そうではありませんでした。使用しなければならないようstrcmp()です。

4

6 に答える 6

115

要するに:

  • strcmpnullで終了するC文字列を比較します
  • strncmpnullで終了するC文字列の最大N文字を比較します
  • memcmpNバイトのバイナリバイトバッファを比較します

したがって、これらの文字列がある場合:

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
于 2012-10-26T23:06:10.007 に答える
9

memcmpバイト数を比較します。 strcmpなどは文字列を比較します。

両方の文字列が5文字の長さ(およびヌルターミネータ)であることがわかっているので、例ではごまかします。ただし、文字列の長さがわからない場合はどうなりますか。これはよくあることです。さて、文字列の扱い方を知っているstrcmpので使用しますが、そうではありません。memcmp

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

あなたが経験している他の問題に関しては、あなたの質問とコードからそれは不明確です。strcmp文字列比較の一般的なケースでは、それよりも優れていますが、ご安心memcmpください。

于 2012-10-26T23:03:27.010 に答える
3

strcmp():

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

strncmp():

  • 前のものと非常によく似ていますが、今回は最初のn文字だけを比較します。これにより、プロセスも遅くなります。

memcmp():

  • この関数は、メモリを使用して2つの変数を比較するために使用されます。それらを1つずつ比較するのではなく、一度に4つの文字を比較します。プログラムの速度が気になる場合は、memcmp()を使用することをお勧めします。
于 2014-09-07T10:55:08.057 に答える
1

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

于 2013-12-10T09:40:01.433 に答える
1

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

于 2014-02-15T23:08:37.467 に答える
0

要約する:

  • strncmp()とstrcmp()は、0バイトを文字列の終わりとして扱い、それを超えて比較しないでください

  • memcmp()にとって、0バイトには特別な意味はありません

于 2021-10-25T16:40:54.323 に答える