Я понимаю, что ошибка сегментации возникает, когда существует проблема с недостаточно распределенной памятью / неправильным направлением указателей.
#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, но это просто практика.