Поскольку по моим необъяснимым причинам никто не ответил на это так, как я делаю сейчас, и, поскольку другие вопросы сейчас закрыты, указывая на этот вопрос, я добавлю это здесь, даже если предстоящий год слишком поздно будет означать, что он завис в самом низу кучи ...
В C ++ 03 std::string
не гарантированно хранит свои символы в непрерывном фрагменте памяти, и результат c_str()
не должен указывать на внутренний буфер строки, поэтому единственный способ гарантированно работает это:
std::vector<char> buffer(s.begin(), s.end());
foo(&buffer[0], buffer.size());
s.assign(buffer.begin(), buffer.end());
Поскольку не было известных реализаций, которые фактически использовали бы несмежную память, и поскольку многие использовали std::string
, как если бы это было гарантировано, правила будут изменены для будущего стандарта, теперь гарантируя непрерывную память для его символов. Так что в C ++ 1x это должно работать:
foo(&s[0], s.size());
Однако это требует предостережения: результат &s[0]
(как результат s.c_str()
, BTW) гарантированно будет действительным, пока любая функция-член вызывается, что может изменить строку. Так что вы не должны хранить результаты этих операций где-либо. Самое безопасное с ними сделать в конце полного выражения, как это делают мои примеры.