2010-07-19 2 views
1

Есть ли способ конвертировать выше?Конвертировать вектор <char> buf (256) в LPCSTR?

Если да, то какой это лучший способ?

Я думаю, вы можете прокрутить вектор и назначить const char*, но я не уверен, что это лучший способ.

+0

Любая причина использования вектора вместо строки? http://stackoverflow.com/questions/1200188/how-to-convert-stdstring-to-lpcstr – DumbCoder

+0

@DumbCoder: см. этот вопрос и первый комментарий GMan по причине: http://stackoverflow.com/questions/ 3279733/ofstream-doesnt-write-buffer-to-file – ereOn

+0

Он находится внутри вариационной функции, используя vsprintf, не знаю, можно ли использовать строки здесь ... –

ответ

3
std::string s(vec.begin(), vec.end()); 
// now use s.c_str() 

Я думаю, что это должно быть достаточно безопасным.

+1

может использовать вместо него конструктор двух итераторов (vec.begin(), vec.end()) '? Кажется, это немного более идиоматично. – Philipp

+0

Очень хорошая точка! & vec [0] - это просто плохая привычка. –

1

Возможно, вы можете использовать std::string вместо std::vector<char>?

Я считаю, что std::string похож на std::vector<char>, поэтому вы можете использовать его таким же образом и воспользоваться его дополнительными функциями.

Если да, std::string имеет способ .c_str(), который возвращает C-строку с нулевым завершением (a const char*).

0

Вы можете сделать что-то вроде этого:

std::string str(&myVec[0], myVec.size()); 

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

+1

Только конструктор, который не принимает параметр размера, требует, чтобы строка была нулевой. –

0

Попробуйте простой

LPCSTR str = &vec[0]; 

вектор уже содержит смежное хранение, которые требуют строк C. Но будьте осторожны, что vec уже завершен с нулевой отметкой и что vec не может быть уничтожен, а str по-прежнему используется. Обычно vec может быть уничтожен, как только он больше не используется, поэтому сохранение указателей в vec опасно и приведет к сбоям. OTOH, передавая указатель в качестве аргумента в порядке аргумента:

f(&vec[0]); // f takes a LPCSTR parameter 
+1

Кроме того, память может перемещаться всякий раз, когда сохраняется больше памяти, поэтому вам нужно убедиться, что вектор не управляется, пока указатель существует. –

Смежные вопросы