-4

質問があります。

以前は私の質問の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;
4

1 に答える 1

0

私が言っているのは、ファイルを間違って読んでいるということです。eof()ファイルの最後を読み取った後にのみ true を返します。読んでいる最後の行は空です (最後のデータの後に改行を追加することを覚えていれば)。

また、(文字列を処理するときに) コードのセグメンテーション違反が発生する原因の 90% にある空の文字列をチェックする必要があります。また、コード全体を投稿するだけでなく、gdb などのデバッガーの使用を開始して、何が問題なのかを調べる必要があります。

于 2012-08-13T00:16:39.747 に答える