Конвертировать std :: string в char * альтернатива - PullRequest
1 голос
/ 11 апреля 2011

Я выполнил поиск в Google, и мне сказали, что это невозможно, поскольку я могу получить только статический char * из строки, поэтому я ищу альтернативу.

Вот ситуация: У меня есть файл .txt, который содержит список других файлов .txt и некоторые цифры, это сделано для того, чтобы программа могла быть добавлена ​​без перекомпиляции. Я использую ifstream, чтобы прочитать имена файлов в строку.

Функция, для которой они требуются, ожидает char *, а не string, и, очевидно, это преобразование невозможно.

У меня есть доступ к этой функции, но она вызывает другую функцию с char *, поэтому я думаю, что я застрял, используя char *.

Кто-нибудь знает об обходной или другой способ сделать это?

Ответы [ 5 ]

12 голосов
/ 11 апреля 2011

В C ++ я всегда делал бы следующее, если требуется не const char*:

std::vector<char> buffer(str.length() + 1, '\0');
std::copy(str.begin(), str.end(), buffer.begin());
char* cstr = &buffer[0];

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

6 голосов
/ 11 апреля 2011

Вы можете получить const char* в строку, используя c_str:

std::string str = "foo bar" ;
const char *ptr = str.c_str() ;

Если вам нужен только символ *, вы должны сделать копию, например, делать:

char *cpy = new char[str.size()+1] ;
strcpy(cpy, str.c_str());
2 голосов
/ 24 февраля 2012

Как упоминалось в предыдущих постерах, если вызываемая функция действительно изменяет строку, вам нужно будет ее скопировать. Однако для дальнейшего использования, если вы просто имеете дело со старой функцией в стиле c, которая принимает символ *, но на самом деле не модифицирует аргумент, вы можете преобразовать результат вызова c_str ().

void oldFn(char *c) { // doesn't modify c }
std::string tStr("asdf");
oldFn(const_cast< char* >(tStr.c_str());
1 голос
/ 11 апреля 2011

Существует c_str();, если вам нужна C-совместимая версия std::string. Смотри http://www.cppreference.com/wiki/string/basic_string/c_str

Это не static, но const. Если вашей другой функции требуется char* (без const), вы можете либо отбросить константу (ВНИМАНИЕ! Убедитесь, что функция не изменяет строку), либо создать локальную копию, как предложено codebolt. Не забудьте delete копию потом!

0 голосов
/ 11 апреля 2011

Разве вы не можете просто передать строку как таковую вашей функции, которая принимает символ *:

func(&string[0]);
...