Воссоздание strstr () - PullRequest
       30

Воссоздание strstr ()

0 голосов
/ 06 марта 2019

Моя цель состоит в том, чтобы воссоздать strstr в функции C с именем myStrStr, которая возвращает 1, если подстрока найдена в стоге сена, и 0, если это не так, все при копировании совпавшей подстроки вбуфер.

Я попытался написать следующий код, чтобы решить эту проблему, и я не уверен, почему он не дает желаемого результата при компиляции и запуске.

int myStrStr(char *haystack, char *needle, char *buffer) {
    int i = 1;
    char *k = (haystack + i);
    for (; *haystack != '\0'; haystack++) {
        if (*haystack == *needle) {
            buffer[0] = *haystack;
            for (; *needle != '\0'; needle++) {
                if (*needle = *k) {
                    buffer[i] = *k;
                    i++;
                    printf("%d\n", i);
                } else
                if (strlen(buffer) == strlen(needle)) {
                    return 1;
                } else {
                    buffer[0] = 0;
                }
            }
        }
    }
    return 0;
}

Пример кода драйвера выглядит следующим образом:

int myStrStr(char[], char[], char[]);

char haystack[][20] = { "chocolate", "vanilla", "caramel", "strawberry", "banana", "cherry" };
    char needle[][20] = { "choc", "lla", "am", "strawberry", "na", "terrible" };
    char buffer[255];

printf("\n\t=========Test #1: myStrStr with '%s' and substring '%s'===========\n\n", haystack[0], needle[0]);
int result = myStrStr(haystack[0],needle[0],buffer);
assert(result == 1&& strcmp(needle[0], buffer) == 0);
printf("\n\t\t....Test Passed\n");

printf("\n\t=========Test #2: myStrStr with '%s' and substring '%s'===========\n\n", haystack[1], needle[1]);
result = myStrStr(haystack[1],needle[1],buffer);
assert(result == 1 && strcmp(needle[1], buffer) == 0);
printf("\n\t\t....Test Passed\n");

Спасибо

1 Ответ

1 голос
/ 06 марта 2019

Функция не работает несколькими способами.

Вот исправленная версия:

int myStrStr(const char *haystack, const char *needle, char *buffer) {
    if (*needle == '\0') {
        /* special case for empty needle: return success with an empty match */
        buffer[0] = '\0';
        return 1;
    }
    for (; *haystack != '\0'; haystack++) {
        if (*haystack == *needle) {
            buffer[0] = *haystack;
            for (size_t i = 1;; i++) {
                buffer[i] = needle[i];
                if (needle[i] == '\0')
                    return 1;
                if (needle[i] != haystack[i])
                    break;
            }
        }
    }
    buffer[0] = '\0';
    return 0;
}

Обратите внимание, что копирование совпавшей строки во время сканирования не требуется, ее будет достаточно скопировать.игла, как только совпадение найдено.На самом деле, содержимое buffer является либо пустой строкой, либо копией needle: не очень полезный побочный эффект.

...