Передайте std :: string в функцию f (** char) - PullRequest
2 голосов
/ 06 июля 2011

Можно ли передать указатель std :: string функции, которая ожидает ** char? Функция ожидает ** char для записи значения в нее.

В настоящее время я делаю следующее:

char *s1;
f(&s1);
std::string s2 = s1;

Не существует более короткого пути? Очевидно, что s2.c_str () не работает, так как возвращает const *char.

Ответы [ 5 ]

5 голосов
/ 06 июля 2011

Это подходящий способ для обработки функций такого рода.Вы не можете передать std::string напрямую, потому что, хотя вы можете преобразовать в строку C, она по-разному размещается в памяти, и поэтому вызываемая функция не будет знать, куда поместить свой результат.

Однако, если возможно, вам следует переписать функцию, чтобы она принимала std::string& или std::string * в качестве аргумента.

(Кроме того, убедитесь, что вы free() или delete[] CСтрока, если необходимо. См. документацию, чтобы узнать, f(), чтобы определить, нужно ли вам это делать.)

2 голосов
/ 06 июля 2011

Да, напишите функцию / макрос-обертку, а затем просто используйте ее

2 голосов
/ 06 июля 2011

Вы не можете - строковый буфер символов недоступен для записи, и вы не должны этого делать.Вы всегда можете использовать промежуточный буфер:

const size_t n = s2.size();

char buf[n + 1];
buf[n] = 0;

std::copy(s2.begin(), s2.end(), buf);

f(&buf);

s2.assign(buf, n);
2 голосов
/ 06 июля 2011

Нет, это невозможно.Функция перезаписывает сам указатель (s1).Вы можете передать массив данных из строки (& s2 [0]), но это позволит только перезаписать текущее зарезервированное пространство содержимого, а не указатель.

Функция также каким-то образом выделяет память для строки.Возможно, вам тоже придется это почистить.Если бы это сработало, как бы оно было очищено?

1 голос
/ 06 июля 2011

Один из способов, которым вы можете передать свою строку в вашу функцию, - это иметь вашу строку

std::string name;

в качестве элемента данных вашего объекта.А затем, в функции f() создайте строку, как вы это сделали, и передайте ее по ссылке, как вы показали

void f( const std::string & parameter_name ) {
    name = parameter_name;
}

Теперь, чтобы скопировать строку в char *, вы можете передать ее в функциюв качестве ссылки на символ:

Из этой ссылки :

Если вы хотите получить доступную для записи копию, такую ​​как str.c_str(), например, char *, вы можете сделать это с помощью этой:

std::string str;
char * writable = new char[str.size() + 1];
std::copy(str.begin(), str.end(), writable);
writable[str.size()] = '\0'; // don't forget the terminating 0

// don't forget to free the string after finished using it
delete[] writable;

Вышеуказанное не является безопасным для исключения!

Затем вы можете передать char * writable в вашу функцию f() по ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...