Найти и заменить часть массива const char - PullRequest
0 голосов
/ 21 сентября 2011

Моя проблема заключается в следующем:

  • a const char* предоставляется функции, в которой я хотел бы выполнить операцию, которую я собираюсь описать
  • предоставляется имя файла (включая полный абсолютный путь) неопределенной длины
  • Я хотел бы найти вхождение подстроки output и заменить ее на input
  • вывод этих операций должен быть другим const char* (слишком много кода, чтобы изменить его, чтобы заменить его std::string)

Что я думал сделать, это следующее

string name(filename); //filename is the "const char*" provided by the caller of the function
string portion("output");
name.replace(name.find(insert),insert.length(),"input");
const char* newfilename = (char*)name.c_str();

Теперь мои вопросы:

  • будет делать эту работу?
  • есть ли лучший способ получить то, что мне нужно?

Спасибо всем, кто поможет.

Federico

1 Ответ

3 голосов
/ 21 сентября 2011

Это сработает, но вам не нужен приведение на name.c_str() (на самом деле, это неправильно: c_str() возвращает const char *).

Но указатель, полученный из name.c_str(), становится недействительным, как только вы измените name или когда name выйдет из области видимости. Так что не пытайтесь вернуть newfilename из функции, например.

Если вам нужно сохранить его, у вас нет другого выбора, кроме как динамически распределять память. Стандартной практикой будет использование интеллектуального указателя для автоматического управления deallocation.const char *, у вас нет другого выбора, кроме как управлять этим самостоятельно. Так что вы могли бы сделать:

char *newfilename = new char[name.length() + 1];
strcpy(newfilename, name.c_str());
return newfilename;
...

delete [] newfilename;


* Ну, стандартной практикой будет использование std::string! Это становится сложнее, только если вам нужно взаимодействовать с унаследованным C API.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...