1

読み取られている文字列の末尾が". そうでない場合は、何かを印刷したいと思います。

if(!line.find_last_of("\"")) {
    cout << "Extra parameter is typed."; 
    continue;

使用しようとしていましfind_last_ofたが、実行すると、コマンドに追加のパラメーターがあるかどうかに関係なく、追加のパラメーターが出力されます。例:

lc "file.txt"   -suppose to true so it's suppose to continue program but returns false
lc "file.txt" lk  - suppose to return false and it does but should only return false for this type of case.
4

3 に答える 3

6

@Jonathon Sengの答えは良い(そして賛成票を投じた)と思いますが、言及する価値のある別の可能性があると思います。の代わりにmystring.at(mystring.length()-1)、次を使用できます*mystring.rbegin()

if (*line.rbegin() == '"') ...

もちろん、文字列が空でないことも確認する必要があります。このため、通常は よりも好む!line.empty()のでline.length() > 0、最終バージョンは次のようになります。

if (!line.empty() && *line.rbegin() == '"') {
    // whatever
}

編集:テスト!line.empty()が最初でなければならないことに注意してください。&&はその左側のオペランドを評価し、それが に評価される場合 (およびその場合のみ) true、右側のオペランドを評価します。最初に行が空でないことを確認してから、文字列が空でない場合にのみ文字をチェックする必要があります。

于 2012-09-14T00:05:22.723 に答える
2

(を確立line.at(line.length() - 1)した後)と比較できます。'"'line.length() > 0

于 2012-09-13T23:36:35.100 に答える
0

これを行う1つの方法は

if( (!(line.find_last_of("\"") == line.length() - 1)) && (line.length() > 0) ) {
   <do your stuff>;
}

string::find_last_of() は、行のどこかに (少なくとも 1 回) 見つかった場合、指定された文字の最後の位置を返します。したがって、最後から 2 番目の文字の場合は、line.length()-2 が返され、ブール式 (if 条件) が最後の文字の場合と同じように動作します。

line.length()が 0 より大きいことを確認することが不可欠です。一致するパターンが見つからない場合は (通常は -1 に等しい) を返すline.length() == 0ため、これは true を返すことがあります。string::find_last_of()string::npos

また、null チェックも忘れないでくださいline

于 2012-09-13T23:41:40.190 に答える