1

重複の可能性:
C++で文字列を分割する

私はC++を使用してクライアントサーバープログラミングを行っています。

クライアントが値を含む文字列を送信します

string receiveClient = "auth#user:pass";

receiveClient変数'#'':'区切り文字で分割するにはどうすればよいですか?


オンラインで見つけたこの機能を使ってみました

vector split (const string &s,char delim)
{
  vector string elems;
  return(s,delim,elems);
}

そして私はでこれをしましたmain()

vector x = split(&receiveClient,"#");

しかし、それは私に次のことを返します

server.cpp: In function ‘int main()’:
server.cpp:128:8: error: missing template arguments before ‘x’
server.cpp:128:8: error: expected ‘;’ before ‘x’
root@ubuntu:/home/baoky/csci222_assn2# g++ server server.cpp
server.cpp:47:1: error: invalid use of template-name ‘std::vector’ without an argument list
server.cpp: In function ‘int main()’:
server.cpp:128:8: error: missing template arguments before ‘x’
server.cpp:128:8: error: expected ‘;’ before ‘x’

すべての助けをありがとう。よろしくお願いします

4

2 に答える 2

3

このようなタスクは通常、C++のストリームを使用して行うのが最も簡単です。このようなものが機能するはずです:

// Beware, brain-compiled code ahead!

#include <vector>
#include <string>
#include <sstream>

std::vector<string> splitClientAuth(const std::string& receiveClient)
{
  // "auth#user:pass"
  std::istringstream iss(receiveClient);

  std::vector<std::string> strings;
  strings.resize(3);
  std::getline(iss, strings[0], '#');
  std::getline(iss, strings[1], ':');
  std::getline(iss, strings[2]); // default is '\n'

  if( !iss && !iss.eof() )
    throw "Dude, you badly need an error handling strategy!";

  if( string[0].empty() || string[1].empty() || string[2].empty() )
    throw "Watcha gonna do now?";

  return strings;
}

注目に値するいくつかの追加のポイント:

  • それらは本当にプレーンテキストのパスワードですか?

  • これを持っているstd::vector<std::string>ことは私には疑わしいようです。それが私のコードである場合、ユーザー情報を格納するデータ構造が必要であり、見つけたものをその中に書き込みます。

  • あなたが質問に貼り付けたコードを完全に理解していないことから判断すると(Martinhoは正しいです、それはとても悪いです、それがまだC ++と見なされるかどうかは議論の余地があります)、そしてあなたのコメントから、あなたは良いC++をひどく必要としているようです

于 2012-08-09T10:24:04.387 に答える
2

オンラインで見つけたコードはゴミです。これを試して

#include <vector>
#include <string>
using namespace std;

vector<string> split(const string& s, char delim)
{
  vector<string> elems(2);
  string::size_type pos = s.find(delim);
  elems[0] = s.substr(0, pos);
  elems[1] = s.substr(pos + 1);
  return elems;
}

これはテストされていないコードであり、エラー チェックは行われません (たとえば、sが含まれていない場合delim)。私はあなたにそれを整理してもらいます。

このように関数を呼び出します

vector<string> x = split(receiveClient, '#');
于 2012-08-09T10:06:50.517 に答える