Преобразуйте станд.:: вектор <символ*> к вектору аргумента c-стиля arv

Предполагая, что Ваш образцовый класс имеет атрибут заголовка, можно просто переопределить to_param метод в рамках модели, как это:

def to_param
  title.downcase.gsub(/ /, '-')
end

Этот эпизод Railscast имеет все подробности. Можно также удостовериться, что заголовок только содержит допустимые символы с помощью этого:

validates_format_of :title, :with => /^[a-z0-9-]+$/,
                    :message => 'can only contain letters, numbers and hyphens'

5
задан Maus 5 November 2009 в 23:30
поделиться

4 ответа

Я думаю, что char

является избыточным, поскольку строка local будет иметь такое же время жизни, также попробуйте добавить программу как argv [0], как сказал Россофт в своем ответе:

const std::string arguments("arg1");    
std::vector<const char*> argv;

argv.push_back("bashscriptXY");
// The string will live as long as a locally allocated char*
argv.push_back(arguments.c_str()); 
argv.push_back(NULL); // finish argv with zero

execve(argv[0], &argv[0], NULL);
5
ответ дан 18 December 2019 в 14:47
поделиться

Помните, что argv [0] всегда является именем самой команды. Итак, если вы хотите передать 1 параметр программе, вам нужно заполнить два элемента:

argv [0] должен быть « bashscriptXY » (или как вам угодно ...)
argv [1] = "your_argument"

5
ответ дан 18 December 2019 в 14:47
поделиться

Несколько проблем:

  • первым элементом массива argv должно быть имя программы
  • вектор argv может take char const * типы, поскольку execve () не изменяет аргументы (хотя вызываемый процесс может - но они будут копиями в его собственном адресном пространстве). Таким образом, вы можете вставить в него строки c_str () . (См. Комментарии)

Попробуйте это:

// unfortunately, execve() wants an array of `char*`, not
//  am array of `char const*`.
//  So we we need to make sure the string data is 
//  actually null terminated
inline
std::string& null_terminate( std::string& s)
{
    s.append( 1, 0);
    return s;
}

// ...

std::string program = std::string( "bashscriptXY");
std::string arg1("arg1");
std::string arg2("arg2");

null_terminate(program);
null_terminate(arg1);
null_terminate(arg2);

std::vector<char *> argv; 

argv.push_back( &program[0]);
argv.push_back( &arg1[0]); 
argv.push_back( &arg2[0]); 
argv.push_back( NULL); // finish argv with zero

intptr_t result = execve( program.c_str(), &argv[0], NULL);
2
ответ дан 18 December 2019 в 14:47
поделиться

Если аргументы не жестко запрограммированы, вам придется выполнить некоторое динамическое выделение памяти. Сначала создайте массив символьных указателей для количества аргументов, затем выделите память для каждого аргумента и скопируйте данные в.

Этот вопрос очень похож и включает некоторые решения кода.

1
ответ дан 18 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: