質問があります。
以前は私の質問の1つでした。
これをコード化したビットマスク:
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();
}
上記のコードを実行すると、エラーが発生します - セグメンテーション コア ダンプ
これは私の account.txt ファイルです
admin:PeterSmite:hr:password
cktang:TangCK:normal:password
ただし、コードをベクトル分割を使用しない古いバージョンに変更すると、コードはスムーズに実行できます。セグメンテーション コア ダンプなし。違いは、上記のベクトルを使用して文字列 sline をベクトルに分割し、それを使用して文字列 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;