@snpgg

Как максимально эффективно по скорости написать этот алгоритм преобразования строки?

#include <stdio.h>
#include <string.h>
#include <assert.h>

char* get_part_path(const char* s, const char* find_path) {
    // todo
    return NULL;
}

int main() {
    assert(strcmp(get_part_path("/base/4", "/"), "base") == 0);
    assert(strcmp(get_part_path("base/4", "/"), "base") == 0);
    assert(strcmp(get_part_path("/base/4", "/base"), "4") == 0);
    assert(strcmp(get_part_path("base/4", "/base"), "4") == 0);
    assert(strcmp(get_part_path("base/4", "/base/4"), "4") == 0);

    printf("All tests passed!\n");
    return 0;
}


Как вы бы писали код такой функции, чтобы он был читаемым и там не было кучи копирований. Поделитесь вариантом. Спасибо!
  • Вопрос задан
  • 140 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
1. Каким-то образом преобразовать обе строки, чтобы избавиться от расхождений по стартовым слэшам. Слишком мало информации, КАК это сделать — возможна ситуация, когда вторая строка не начинается со слэша, а первая нет, но бывают ли другие?
2. Убедиться, что вторая строка — префикс первой. Если нет — непонятно, что делать.
3. Если вторая строка непуста и не кончается слэшом, убедиться, что в первой на этом месте слэш. Пропустить его.
4.1. Если от первой строки ничего не осталось — если в конце слэш, пропустить, и извлечь кусок до следующего с конца слэша.
4.2. А если осталось — извлечь кусок до слэша.
5. Придумай методику хранения информации. Вероятно, выделить память? — тогда на каждый результат придётся давать free.
Ответ написан
Комментировать
grantur5707
@grantur5707
Full Stack Web Developer
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>

char* get_part_path(const char* s, const char* find_path) {
    const char* start = strstr(s, find_path);
    if (!start) {
        return NULL;
    }

    start += strlen(find_path);

    while (*start == '/') {
        start++;
    }

    const char* end = strchr(start, '/');
    if (!end) {
        end = s + strlen(s);
    }

    size_t len = end - start;
    char* result = (char*)malloc(len + 1);
    if (result) {
        strncpy(result, start, len);
        result[len] = '\0';
    }

    return result;
}

int main() {
    assert(strcmp(get_part_path("/base/4", "/"), "base") == 0);
    assert(strcmp(get_part_path("base/4", "/"), "base") == 0);
    assert(strcmp(get_part_path("/base/4", "/base"), "4") == 0);
    assert(strcmp(get_part_path("base/4", "/base"), "4") == 0);
    assert(strcmp(get_part_path("base/4", "/base/4"), "4") == 0);

    printf("All tests passed!\n");
    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы