huoyu123 发表于 2011-2-25 18:32:42

C++字符串分离器 - StringTokenizer

来源:IIEEG02-24-2011
  1. Tokenizer类 - 实现
  // @author - Patric Ye
  // @Date - 13 September, 2010
  // @Version - 0.1
  #include "stdafx.h"
  #include
  using namespace std;
  class CStringTokenizer {
  public:
  CStringTokenizer(const std::string& _str, const std::string& _delim);
  ~CStringTokenizer(){};
  int countTokens();
  bool hasMoreTokens();
  string nextToken();
  int nextIntToken();
  double nextFloatToken();
  string nextToken(const std::string& delim);
  string remainingString();
  string filterNextToken(const std::string& filterStr);
  private:
  string token_str;
  string delim;
  };
  CStringTokenizer::CStringTokenizer(const string& _str, const string& _delim)
  {
  if ((_str.length() == 0) || (_delim.length() == 0)) return;
  token_str = _str;
  delim = _delim;
  /*
  Remove sequential delimiter
  */
  unsigned int curr_pos = 0;
  while(true)
  {
  if ((curr_pos = token_str.find(delim,curr_pos)) != string::npos)
  {
  curr_pos += delim.length();
  while(token_str.find(delim,curr_pos) == curr_pos)
  {
  token_str.erase(curr_pos,delim.length());
  }
  }
  else
  {
  break;
  }
  }
  /*
  Trim leading delimiter
  */
  if (token_str.find(delim,0) == 0)
  {
  token_str.erase(0,delim.length());
  }
  /*
  Trim ending delimiter
  */
  curr_pos = 0;
  if ((curr_pos = token_str.rfind(delim)) != string::npos)
  {
  if (curr_pos != (token_str.length() - delim.length())) return;
  token_str.erase(token_str.length() - delim.length(),delim.length());
  }
  }
  int CStringTokenizer::countTokens() {
  unsigned int prev_pos = 0;
  int num_tokens = 0;
  if (token_str.length() > 0)
  {
  num_tokens = 0;
  unsigned int curr_pos = 0;
  while(true)
  {
  if ((curr_pos = token_str.find(delim,curr_pos)) != string::npos)
  {
  num_tokens++;
  prev_pos = curr_pos;
  curr_pos += delim.length();
  }
  else
  {
  break;
  }
  }
  return ++num_tokens;
  }
  else
  {
  return 0;
  }
  }
  bool CStringTokenizer::hasMoreTokens()
  {
  return (token_str.length() > 0);
  }
  string CStringTokenizer::nextToken()
  {
  if (token_str.length() == 0)
  {
  return "";
  }
  string tmp_str = "";
  unsigned int pos = token_str.find(delim,0);
  if (pos != string::npos)
  {
  tmp_str = token_str.substr(0,pos);
  token_str = token_str.substr(pos+delim.length(),token_str.length()-pos);
  }
  else
  {
  tmp_str = token_str.substr(0,token_str.length());
  token_str = "";
  }
  return tmp_str;
  }
  int CStringTokenizer::nextIntToken()
  {
  return atoi(nextToken().c_str());
  }
  double CStringTokenizer::nextFloatToken()
  {
  return atof(nextToken().c_str());
  }
  string CStringTokenizer::nextToken(const string& delimiter)
  {
  if (token_str.length() == 0)
  {
  return "";
  }
  string tmp_str = "";
  unsigned int pos = token_str.find(delimiter,0);
  if (pos != string::npos)
  {
  tmp_str = token_str.substr(0,pos);
  token_str = token_str.substr(pos + delimiter.length(),token_str.length() - pos);
  }
  else
  {
  tmp_str = token_str.substr(0,token_str.length());
  token_str = "";
  }
  return tmp_str;
  }
  string CStringTokenizer::remainingString()
  {
  return token_str;
  }
  string CStringTokenizer::filterNextToken(const string& filterStr)
  {
  string tmp_str = nextToken();
  unsigned int currentPos = 0;
  while((currentPos = tmp_str.find(filterStr,currentPos)) != string::npos)
  {
  tmp_str.erase(currentPos,filterStr.length());
  }
  return tmp_str;
  }
  2. Tokenizer类 - 使用
  CStringTokenizer token(strHashRange, ",");
  while( token.hasMoreTokens() )
  {
  cout<<(uint32)token.nextFloatToken());
  }

页: [1]
查看完整版本: C++字符串分离器 - StringTokenizer