Загрузка...

Parsing substrings in C+

Thread in C/C++ created by magnolia_aztec Nov 8, 2025. 320 views

  1. magnolia_aztec
    magnolia_aztec Topic starter Nov 8, 2025 6 Jan 29, 2025
    Всем традиционный привет!



    Стоит задача спарсить подстроку по двум меткам. Первая метка обозначает начало подстроки. Вторая метка соответственно конец. Раньше исходную строку закидывал в string и всё работало. Теперь её засунул в char* чтобы закосить под профи:) Получил такой код:


    C
    #include <Windows.h>
    #include <iostream>
    #include <cstring>


    char* pars_url(char* str, const char* substr_begin, const char* substr_end, int& error) {
    // Ищем начальную подстроку
    char* start = strstr(str, substr_begin);
    if (start == nullptr) {
    error = 1; // Начальная подстрока не найдена
    return nullptr;
    }

    // Сдвигаемся по длине начальной подстроки
    start += strlen(substr_begin);

    // Ищем конечную подстроку
    char* end = strstr(start, substr_end);
    if (end == nullptr) {
    error = 2; // Конечная подстрока не найдена
    return nullptr;
    }

    // Вычисляем длину искомой подстроки
    size_t length = end - start;

    // Выделяем память для новой строки
    char* result = new char[length];

    // Копируем найденную подстроку в новую строку без использования strncpy
    for (size_t i = 0; i < length; ++i) {
    result = start;
    }


    error = 0; // Успешное выполнение
    return result;
    }

    int main() {

    char str[] = "adsfadsip^192.168.0.12^endsfgfdjfdkjf;alk";
    const char* substr_begin = "ip^";
    const char* substr_end = "^end";
    int error;
    char* result_ch = pars_url(str, substr_begin, substr_end, error);

    if (error == 0) {
    std::cout << "Extracted IP: " << result_ch << std::endl;
    }
    else {
    std::cerr << "Error: " << error << std::endl;
    }
    return 0;
    }
    На выходе получаю вроде как достаточный результат.
    [IMG]
    Снимок.JPG

    Только что это за еб#нь в конце в виде каких то кругляков? перепроверил размерность переменной result_ch, пробовал разные функции типа strncpy. Результат один. Грёб##ый С++, да простит меня его создатель за такие слова. Целый день убил на казалось бы простую вещь. Под конец дня одни эмоции накопились, сдаюсь.
     
  2. oboev
    добавляй терминирующий ноль в конце, чтобы поток вывода знал когда остановиться, посмотри что выводит strlen для result_ch
     
  3. Alexa
    Неуверен, но у тебя массив для строки похоже создается больше, чем сама строка. В итоге пустые ячейки забиты мусором, который ты и видишь в консоли. Строка даже без \0 в конце норм может выводиться (наскок помню). Ты можешь выделять память под строку с помощью calloc, и даже если у тебя будет массив больше чем строка, то остальные ячейки будут забиты нулями на автомате, ненадо будет проставлять \0 самому. Ну это просто к сведению, вообще прикол выше решает проблему уже
     
  4. ПожилаяШляпа
    Массив должен быть length+1, а последний символ - \0
     
Loading...