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()
を使用する必要があるようです。
要するに:
したがって、これらの文字列がある場合:
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
などはstringsと比較します。
両方の文字列が5文字の長さ(およびヌルターミネータを加えたもの)であることを知っているため、この例ではごまかします。ただし、文字列の長さがわからない場合はどうなりますか? 文字列の処理方法を知っているであるため、strcmp
は使用しないため、memcmp
を使用します。
memcmp
は、バイトシーケンスの比較に関するものです。各文字列の長さがわかっている場合は、memcmp
を使用して比較できますが、その頻度はどれくらいですか?まれに。多くの場合、文字列比較関数が必要です。なぜなら、文字列とは何か、またそれらを比較する方法を知っているからです。
あなたが経験している他の問題に関しては、あなたの質問とコードからそれは不明です。ただし、strcmp
は、memcmp
よりも一般的な文字列比較の場合に適しています。
strncmpとmemcmpは、前者がNULLで終了する文字列を処理するという事実を除いて同じです。
Strcmpの場合、文字列になることがわかっているものだけを比較する必要がありますが、バイナリファイルの行を読み取るなど、常にそうであるとは限らないため、memcmpを使用して、 NUL文字は一致しますが、さらに入力の長さをチェックし続けることができます。