0

私は新しい C 言語プログラマーです。

私は2つのファイルを持っています。1 つは次のような行で構成されます。

84:1b:5e:a8:bf:7f

00:8e:f2:c0:13:cc

もう 1 つは、次のような行で構成されます。

00-22-39

8C-FD-F0

私の質問は、C 言語を使用して最初のファイルの行の前半を 2 番目のファイルの行と比較するにはどうすればよいですか? 同様に: 84:1b:5e8C-FD-F0と同じですか? さらに比較するために、これらの行を格納する配列を作成する方法を知っています。しかし、本当に配列を作成する必要があるのでしょうか?

PS: 比較では大文字と小文字が区別されません

4

2 に答える 2

0

どのルールが一致を構成するかについて、あなたはあまり明確ではありませんでした。しかし、バイト値を比較したい場合は、各行を解析してそれらのバイト値に変換する必要があります。

のバリエーションを使用strtok()して、各行から値を取得できます。ただし、 のバリエーションのsscanf()方が簡単な場合があります。各ファイルからバイナリ値を取得したら、それらを比較できます。

于 2013-09-12T14:52:22.560 に答える
0

2 番目のファイルを完全に読み取り、内容を並べ替えられた配列に格納します。次に、最初のファイルから読み取られた行ごとに、並べ替えられた配列をバイナリ検索して、一致する行を見つけます。

実装は以下。gcc でコンパイルします。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>

int cmp(const void * s1, const void * s2)
{
    return strcasecmp(*(char **)s1, *(char **)s2);
}

int cmp_half(const char * s1, const char * s2)
{
    int i;
    for (i = 0; i < 3; i++)
    {
        int res = strncasecmp((char *)s1+i*3, (char *)s2+i*3, 2);
        if (res != 0) return res;
    }

    return 0;
}

char * line[1024];
int n = 0;

int search(const char * s)
{
    int first, last, middle;
    first = 0;
    last = n - 1;
    middle = (first+last)/2;

    while( first <= last )
    {
        int res = cmp_half(s, line[middle]);
        if (res == 0) return middle;
        if (res > 0)
            first = middle + 1;    
        else
            last = middle - 1;

        middle = (first + last)/2;
    }
    return -1;
}

int main()
{
    FILE * f1, * f2;
    char * s;
    char buf[1024*1024], text[1024];

    f1 = fopen("file1.txt", "rt");
    f2 = fopen("file2.txt", "rt");

    s = buf;
    while (fgets(s, 1024, f2) != NULL)
    {
        line[n] = s;
        s = s+strlen(s)+1;
        n++;
    }

    qsort(line, n, sizeof(char *), cmp);

    while (fgets(text, 1024, f1) != NULL)
    {
    text[strlen(text)-1] = 0;
        int idx = search(text);
        if (idx >= 0)
        {
            printf("%s matched %s\n", text, line[idx]);
        }
        else
        {
            printf("%s not matched\n", text);
        }
    }

    return 0;
}
于 2013-09-12T14:57:29.877 に答える