Преобразование std :: string в массив char

Я видел много похожих вопросов, но ни один из них, похоже, не работает для моего кода, я думаю, что пропускаю что-то простое, может быть, вы можете помочь.

Прямо сейчас я создаю строку для отправки в качестве запроса к функции отправки winsock, которая требует отправки char []. Мне нужно преобразовать мой std :: string в массив char (char []).

В настоящее время это запрос, который работает:

char request [] = "GET /gwc/cgi-bin/fc?client=udayton0.1&hostfile=1HTTP/1.0\nHost:www.gofoxy.net\n\n";

Но мне нужно изменить строку запроса на ту же структуру данных.

Я ценю любую помощь!

редактировать:

Я могу преобразовать строку в символ *, но как я могу использовать это, чтобы получить
массив символов? Я надеюсь, что я не делаю это более запутанным. Вот
две попытки, которые приводят к тому, что char star не совместимы с send
запрос, когда я бегу:

//convert request into a char[]
//char *req_ch = new char[req_str.size()+1];
//hostCh[req_str.size()] = 0;
//memcpy(req_ch, req_str.c_str(), req_str.size());

//char * req = new char[req_str.size() +1];
//std::copy(req_str.begin(), req_str.end(), req);
//req[req_str.size()] = '\0';

3

Решение

Если у вас есть какой-то устаревший API в стиле C с такой подписью, где он ожидает строку в стиле C с нулевым символом в конце:

void foo(const char* data);

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

std::string s("my string data");
foo(s.c_str());

Если вам действительно нужен массив или неконстантная версия данных, то API это:

void foo(char* data, std::size_t len);  // or foo(char[] data, std::size_t len);

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

std::string s("my string data");
std::vector<char> v(s.begin(), s.end());
foo(&v[0], v.size());    // or foo(v.data(), v.size()); in C++11
8

Другие решения

Вы действительно нуждаетесь char[] или будет char const* делать?

Если последнее, c_str () будет делать то, что вы хотите.

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

std::vector<char> buff(str.size() + 1); // initializes to all 0's.
std::copy(str.begin(), str.end(), buff.begin());
fun_call(&buff[0]);

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

2

По вопросам рекламы [email protected]