0

std::find が期待どおりに評価されません。

次のように定義されたベクトル lexeme_ があります

static const std::string delimiters_[] = {" ", ",", "(", ")", ";", "=", ".", "*", "-"};

static std::vector<std::string> lexeme_(std::begin(delimiters_), std::end(delimiters_));

std::find私は次のように定義された評価をしています

while ( std::find(lexeme_.begin(),lexeme_.end(),std::string(&commandLine_.at(position_))) == lexeme_.end())             
{
    // Concat each successive alphanumeric character to 'token'
    token += commandLine_.at(position_);
    // Update the index into 'commandLine'
    position_ += 1;
}

評価は、この Java 式と同様にchar、lexeme_ 内の aと commandLine 内の a を比較することになっています。char

!lexeme.contains(Character.toString(commandLine.charAt(position)))  

評価は s を比較することになっており、比較でinが満たされてcharいると判断された場合、while ループは終了します。chardelimiters

テストケース

#include<algorithm>
#include<iostream>    

static const std::string delimiters_[] = {" ", ",", "(", ")", ";", "=", ".", "*", "-"};

static std::vector<std::string> lexeme_(std::begin(delimiters_), std::end(delimiters_));

std::string commandLine = "check me";

while (std::find(lexeme_.begin(),lexeme_.end(),std::string(&commandLine_.at(position_))) == lexeme_.end())             
{
    std::cout "I should stop printing when encountering a space ' ' << std::endl;
}
4

2 に答える 2

3

一時比較文字列のコンストラクタが正しくありません。単一文字の文字列を構築するのではなく、その文字から始まり、元の文字列の最後まで文字列を構築しています。運が良ければ、std::string自動的にゼロ終了しない実装がどこかにあるかもしれません内部バッファ。

したがって、これの代わりに:

std::string(&commandLine_.at(position_))

使用する:

std::string(1, commandLine_.at(position_))
于 2013-04-08T21:33:49.973 に答える
2

この式:

 std::string(&commandLine_.at(position_))

std::stringオブジェクトへのポインターを渡すことによってオブジェクトを作成しcharます。ただし、charオブジェクトへのポインターは (null で終わる) C 文字列であり、単一の文字へのポインターではありません。

std::string単一の文字を受け入れるコンストラクターはありません。ベクトルをchars のベクトルにして、そのベクトル内を検索できますcommandLine_.at(position_)

ただし、テストケースから判断すると、必要なのは次のfind_first_of()メンバー関数だけですstd::string

#include <algorithm>
#include <iostream>

int main()
{
    std::string commandLine = "Check me";
    std::string delimiters = " ,();=.*-";
    auto pos = commandLine.find_first_of(delimiters);
    std::cout << pos;
}

これが実際のです。

于 2013-04-08T21:33:42.307 に答える