C ++如何使此向量函数接受任何分隔符

时间:2012-08-12 13:20:23

标签: c++

我有一个问题。

以前是我的第一个问题。

位掩码编码:

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

我用这种方法:

vector<string> x = split(receiveClient, '#');

然而,当我意识到分隔符固定为#时,在某些时候,我需要使用“:”或其他分隔符来分割字符串,所以我的问题是,如何更改函数以便它可以接受分隔符我传入。

,例如

vector<string> x = split(receiveClient, ':');

我遇到的一些问题是“细分核心转储错误”

无法使用的版本

if(action=="auth")
{


 myfile.open("account.txt");
    while(!myfile.eof())
    {
        getline(myfile,sline);

    vector<string> check = split(sline, ':');

    logincheck = check[0] + ":" + check[3];
    cout << logincheck << endl;

    if (logincheck==actionvalue)
    {
    sendClient = "login done#Successfully Login.";
    break;
    }
    else
    {
    sendClient = "fail login#Invalid username/password.";
    }

    }
    myfile.close();



}

运行上面的代码让我错误 - Segmentation Core Dump

这是我的account.txt文件

admin:PeterSmite:hr:password
cktang:TangCK:normal:password

但是,如果我将代码更改为不使用矢量拆分的旧版本,则代码可以顺利运行。没有分段核心转储。区别在于上面的使用向量将字符串sline拆分为vector,然后用它来分配给字符串logincheck

工作版(不带矢量分割)

if(action=="auth")
{


 myfile.open("account.txt");
    while(!myfile.eof())
    {
        getline(myfile,sline);
    //action value is in form of like demo:pass (user input)
    if (sline==actionvalue)
    {
    sendClient = "login done#Successfully Login.";
    break;
    }
    else
    {
    sendClient = "fail login#Invalid username/password.";
    }

    }
    myfile.close();



}

我的问题是,如何在没有分段核心转储的情况下将其拆分为带有矢量拆分的代码

 vector<string> check = split(sline, ':');

    logincheck = check[0] + ":" + check[3];
    cout << logincheck << endl;

1 个答案:

答案 0 :(得分:0)

我只是说,你正在读错文件。读取文件末尾后,eof()仅返回true。您正在阅读的最后一行是空的(如果您记得在最后一个数据之后添加换行符,就像您应该的那样)。

你应该检查空字符串,这是90%导致编写代码段错误(处理字符串时)的原因。你应该开始使用调试器,比如gdb,找出问题所在而不只是发布整个代码。