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;
}

这是未经测试的代码,它不做任何错误检查(例如 what if sdoes not contain delim)。我会让你解决这个问题。

你这样调用函数

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