我有一个问题。
以前是我的第一个问题。
位掩码编码:
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;
答案 0 :(得分:0)
我只是说,你正在读错文件。读取文件末尾后,eof()
仅返回true。您正在阅读的最后一行是空的(如果您记得在最后一个数据之后添加换行符,就像您应该的那样)。
你应该检查空字符串,这是90%导致编写代码段错误(处理字符串时)的原因。你应该开始使用调试器,比如gdb,找出问题所在而不只是发布整个代码。