Возникли проблемы с использованием реализации memmem () в Windows - PullRequest
0 голосов
/ 24 мая 2019

Когда я использую функцию, я получаю только NULL, я что-то не так делаю?Я пытаюсь прочитать файл в двоичном виде, а затем выяснить, есть ли там конкретная подпись

Вот мой код:

#include <stdio.h>
void *memmem(const void *haystack, size_t haystack_len, const void * const needle, const size_t needle_len);
#define TEXT2 "hey"

int main(void)
{   
    unsigned char* buffer = NULL;
    FILE* file = fopen("lol.txt", "rb");

    long bufferLen = 0;

    fseek(file, 0, SEEK_END);
    bufferLen = ftell(file);
    fseek(file, 0, SEEK_SET);

    buffer = (char*)calloc(bufferLen, sizeof(char));


    fread(buffer, sizeof(char), bufferLen, file);
    fclose(file);

    char *pos = memmem(buffer, bufferLen, TEXT2, sizeof(TEXT2));

    if (pos != NULL)
        printf("hey");

    getchar();
    return 0;
}


void *memmem(const void *haystack, size_t haystack_len, const void * const needle, const size_t needle_len)
{
    if (haystack == NULL) return NULL; // or assert(haystack != NULL);
    if (haystack_len == 0) return NULL;
    if (needle == NULL) return NULL; // or assert(needle != NULL);
    if (needle_len == 0) return NULL;

    for (const char *h = haystack; haystack_len >= needle_len; ++h, --haystack_len) 
    {
        if (!memcmp(h, needle, needle_len)) 
        {
            return h;
        }
    }
    return NULL;
}

Я пытался это сделать, ноэто всегда возвращает меня к нулю, есть какие-нибудь идеи?я делаю что-то не так?

1 Ответ

2 голосов
/ 24 мая 2019
char *pos = memmem(buffer, bufferLen, TEXT2, sizeof(TEXT2));
//                                           ^^^^^^^^^^^^^

sizeof "hey" равно 4. "hey" имеет тип char[4].

Заменить на strlen("hey")

char *pos = memmem(buffer, bufferLen, TEXT2, strlen(TEXT2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...