SegFault при использовании std :: string :: operator + = с функцией в качестве параметра - PullRequest
0 голосов
/ 17 октября 2018

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

#include <iostream>
using namespace std;

const char *hex(char);

int main(int argc, char **argv)
{
    string url = "start http://www.cplusplus.com/search.do?q=";
    char a[2];

    for (int i = 0; i < argc; i++)
    {
        if (i != 1)
            url += '+';
        for (int j = 0; argv[i][j]; j++)
        {
            if (i == 1 && j == 0 && argv[i][j] == '.')
                continue;
            url += '%';

            // a[0] = argv[i][j] / 16;
            // a[1] = argv[i][j] % 16;
            // for (int k = 0; k < 2; k++)
            // {
            //  if (a[k] > 9)
            //      a[k] += 'A' - 10;
            //  else
            //      a[k] += '0';
            //  url += a[k];
            // }

            url += hex(argv[i][j]);
        }
    }
    system(url.c_str());
    return 0;
}

const char *hex(char c)
{
    char h = {c / 16, c % 16, '\0'};
    for (int k = 0; k < 2; k++)
        if (h[k] > 9)
            h[k] += 'A' - 10;
        else
            h[k] += '0';
    return h;
}

Но для этого фрагмента кода, который, как ожидается, будет работать как команда для URL, кодирующая передаваемые аргументы, существует проблема с оператором + = для строкового класса.Я следовал за этим в отладчике, и функция hex работает правильно (возвращает hexValue char c).

Но в этой строке url += hex(argv[i][j]); по какой-то причине есть segFault, argv [i] [j]char и hex () возвращает свое шестнадцатеричное значение в виде const cstring (const char *).Я даже добавил нулевой символ в конце, если это что-то изменило ...

Я даже проверил ссылку на std :: string, чтобы убедиться, что оператор принимает const char * (но это очевидно, в противном случаебыли бы ошибки Compile-t, которых у меня не было).

Есть предположения?Кстати, закомментированный код заменяет код функционального стиля и работает безупречно, конечно, в Windows.

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

1 Ответ

0 голосов
/ 17 октября 2018

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

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

Поскольку вы используете C ++, просто используйте std::string:

std::string hex(const char c)
{
    std::string h = {c / 16, c % 16, '\0'};

    for (int k = 0; k < 2; k++)
        if (h[k] > 9)
            h[k] += 'A' - 10;
        else
            h[k] += '0';

    return h;
}

Такжевместо того, чтобы изобретать велосипед, рассмотрите возможность использования таких вещей, как std::hex, чтобы сделать это для вас , как показано здесь .

...