std :: find没有按预期运行

时间:2013-04-08 21:28:47

标签: c++ find

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;
}

评估应该将lexeme_中的char与commandLine中的char进行比较,类似于此Java表达式

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

评估应该比较char s,如果它确定比较中满足char中的delimiters,那么while循环将退出。

测试用例

#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;
}

2 个答案:

答案 0 :(得分:3)

临时比较字符串的构造函数不正确。它没有构建单字符字符串,它正在构建一个从该字符开始的字符串并转到原始字符串的末尾,如果你很幸运的话 - 那里可能会有一些std::string实现自动将零终止内部缓冲区。

所以不要这样:

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

使用:

std::string(1, commandLine_.at(position_))

答案 1 :(得分:2)

这个表达式:

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

通过将指针传递给std::string对象来创建char对象。但是,指向char对象的指针是(以null结尾的)C字符串,而不是指向单个字符的指针。

没有std::string的构造函数接受单个字符。您可以将矢量设为char s的矢量,然后在该矢量中搜索commandLine_.at(position_)

但是,从您的测试用例来看,在我看来,您想要的只是std::string的{​​{3}}成员函数:

#include <algorithm>
#include <iostream>

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

这是find_first_of()