3

私は多くの同様の質問を見てきましたが、私のコードで機能しているように見えるものはありません。基本的なことを見落としていると思います。

現在、winsock send 関数へのリクエストとして送信される文字列を作成しています。これには、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 * に変換できますが、それを使用して文字配列を取得するにはどうすればよいですか? これ以上混乱させないことを願っています。実行時に送信リクエストと互換性のない文字スターを生成する2つの試みを次に示します。

//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';
4

2 に答える 2

8

このような署名を持つ従来の C スタイルの API があり、null で終了する C スタイルの文字列が必要な場合:

void foo(const char* data);

次に、通常は次のようなことができます。

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

配列、またはデータの非 const バージョンが本当に必要な場合、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
于 2012-09-11T02:05:55.233 に答える
2

あなたは本当に必要です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 番目のバージョンが必要な場合は、読んでいて、おそらく、うまくいけば、バフの最大サイズを提供しています。

于 2012-09-11T01:56:48.840 に答える