0

可能重复:
在 C++ 中拆分字符串

我从我的问题中得到的一个答案中得到了这个向量函数

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

但是,它只接受 2 个元素。如何根据字符串 s 中存在多少 delimiter 来修改它以接受?

例如,如果我有这个:

user#password#name#fullname#telephone

有时大小可能会有所不同。

无论有多少元素,我怎样才能使这个函数灵活地工作,并且能够像上面的这个函数一样拆分?

只是为了进一步解释我的问题:

我想要实现的是使用这个向量函数分割的能力,相同的分隔符到 N 大小,而不是固定在大小 2。

此函数只能拆分字符串中的最多 2 个元素,超过该值会导致 Segmentation core dump

和以前一样,我只需要使用

user:pass

现在我添加了更多属性,所以我需要能够拆分

user:pass:name:department

其中 x[2] 和 x[3] 将分别返回姓名和部门

他们都将使用相同的分隔符。

进一步更新:

我尝试使用以下答案之一提供的此功能

vector<string> split(const string& s, char delim)
{
bool found;
vector<string> elems;
  while(1){
   string::size_type pos = s.find(delim);
   if (found==string::npos)break;
   elems.push_back(s.substr(0, pos));
   s=s.substr(pos + 1);
  }
  return elems;
}

我得到了一些错误

server.cpp: In function ‘std::vector<std::basic_string<char> > split(const string&, char)’:
server.cpp:57:22: error: passing ‘const string {aka const std::basic_string<char>}’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ discards qualifiers [-fpermissive]
4

3 回答 3

1

像这样的东西%)

  vector<string> elems;
  while(1){
   string::size_type pos = s.find(delim);
   if (found==string::npos)break;
   elems.push_back(s.substr(0, pos));
   s=s.substr(pos + 1);
  }
  if(s.size())elems.push_back(s);
  return elems;
于 2012-08-12T08:21:38.823 回答
0

好吧,你知道的,看看push_back成员函数……

于 2012-08-12T08:04:03.397 回答
0

提供通用拆分功能的几乎重复的答案有一个:

std::vector<std::string> split(std::string const& str, std::string const& delimiters = "#") {
  std::vector<std::string> tokens;

  // Skip delimiters at beginning.
  string::size_type lastPos = str.find_first_not_of(delimiters, 0);
  // Find first "non-delimiter".
  string::size_type pos = str.find_first_of(delimiters, lastPos);

  while (string::npos != pos || string::npos != lastPos) {
    // Found a token, add it to the vector.
    tokens.push_back(str.substr(lastPos, pos - lastPos));
    // Skip delimiters.  Note the "not_of"
    lastPos = str.find_first_not_of(delimiters, pos);
    // Find next "non-delimiter"
    pos = str.find_first_of(delimiters, lastPos);
  }
  return tokens;
}

可以很容易地包装成:

std::vector<std::string> split(std::string const& str, char const delimiter) {
  return split(str,std::string(1,delimiter));
}
于 2012-08-12T08:26:18.073 回答