Как преобразовать строку в массив char *
Я изменил свой код, теперь во время компиляции происходят эти ошибки:
`check.cpp: In function ‘int main()’:`
check.cpp:14:55: error: invalid conversion from ‘const char**’ to ‘char* const*’ [-fpermissive]
/usr/include/getopt.h:152:12: error: initializing argument 2 of ‘int getopt(int, char* const*, const char*)’ [-fpermissive]
int main() {
string text="-f input.gmn -output.jpg";
int argc=text.length();
cout<<"argc: "<<argc<<endl;
char const * argv = text.c_str();
cout<<"argv: "<<argv<<endl;
int c = getopt (argc, &argv, "f:s:o:pw:h:z:t:d:a:b:?");
return 0;
}
3 ответа
Ты можешь использовать text.c_str()
преобразовать std::string
в const char*
, Смотрите здесь.
Чтобы уточнить мой ответ, есть много способов создать нужный массив, но это уже описано здесь, здесь, здесь и здесь. Простое решение вашей проблемы, которое не связано с new
/malloc
или интенсивное использование STL и istringstream
/back_inserter
/copy
что не так и выполняет очень быстро может выглядеть так:
/* variables. */
std::vector< char* > argv;
int i, argc, state;
char c;
/* convert string to char string with automatic garbage collection. */
std::vector< char > tokens(text.begin(), text.end());
tokens.push_back(0);
/* tokenize string with space. */
for (state=0, argc=0, i=0; (c=tokens[i]); i++) {
if (state) {
if (c == ' ') {
tokens[i]=0;
state=0;
}
} else {
if (c != ' ') {
argv.push_back(&tokens[i]);
argc++;
state=1;
}
}
}
/* print argv. */
std::cout << "argc: " << argc << std::endl;
for (i=0; i < argc; i++) {
std::cout << "argv[" << i << "]: " << argv[i] << std::endl;
}
/* call getopt. */
c = getopt(argc, &argv[0], "f:s:o:pw:h:z:t:d:a:b:?");
Это всего лишь пример, но одним из преимуществ этого вида кода является то, что вы можете использовать другие символы в качестве разделителя, а не просто пробел, и что вам не нужно заботиться об освобождении выделенной памяти, так как std::vector
делает это для вас при выходе из функции.
Первая ошибка с вашим кодом - это сравнение:
for (int i=0; i<=stringLength; i++) {
arv[i]=text[i];
}
использование i< stringLength
вместо i<=stringLength
,
Вторая ошибка в том, что arv
не заканчивается нулем.
После исправления обеих ошибок ваш код должен выглядеть так:
for (int i=0; i < stringLength; i++) {
arv[i]=text[i];
}
arv[stringLength] = '\0';
Кстати, правильная функция подписи getopt
это:
int getopt(int argc, char * const argv[], const char *optstring);
который принимает второй и третий аргумент как const
, Это означает, что вы можете сделать это:
char const * s = text.c_str();
int c = getopt (argc, &s, "f:s:o:pw:h:z:t:d:a:b:?");
Нет необходимости каких-либо преобразований, используя ручной цикл.
Короче говоря, у вас есть массив argv, который содержит 100 указателей на строки, из которых установлен только первый. argv[1] не был установлен на что-либо, поэтому указывает куда-то случайно. И в этом случае незаконно.
Более того, то, что ожидает getoption, будет больше похоже на это:
argv[0] = "progname";
argv[1] = "-f";
argv[2] = "input.gmn"
argv[3] = "-output.jpg"
argv[4] = 0
Обратите внимание на =0 в конце, чтобы прекратить сборы геотипии через случайные биты памяти