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

评估应该将charlexeme_ 中的 achar与类似于此 Java 表达式的命令行中的 a 进行比较

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

评估应该比较chars 并且如果它确定chardelimiters比较中满足 a in ,则 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;
}
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对象的指针是(以空结尾的)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 回答