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