说我有文字说'#'作为分隔符。 例子
std::string key = "012#txt1#txt2#txt3#txt4# #some other text:"
我必须在#at position 5和#at position 6之间插入修改过的文本。上面显示的文本中间有空格。
要做到这一点,我需要找到#5和#6#。 我写了一个小代码,但它没有做我想做的事情。它总是先返回找到'#'。有人可以建议我。
std::string temp = key;
size_t found = 0;
size_t pos_key = temp.find('#');
while( ( found !=5 )&& ( pos_key != std::string::npos ) )
{
found++;
temp.find_first_of('#', pos_key + 1 );
temp.erase(0, pos_key );
}
std::cout << " the pos key is " << pos_key << std::endl ;
答案 0 :(得分:2)
有几个问题正在发生。首先,你永远不会更新pos_key
所以当你打电话给erase
时,你会在你的字符串上st脚,我不知道你为什么这样做。如果您需要找到第n个符号,可以使用如下函数:
size_t find_nth(const std::string & line, const std::string & symbol, size_t nth)
{
size_t pos = 0;
size_t counter = 0;
while (counter < nth && (pos = line.find(symbol, pos)) != std::string::npos)
{
counter++; // found a match so increment
pos++; // increment so we search for the next one
}
return pos;
}
你可以看到它在 Live Example
中运行答案 1 :(得分:2)
看来你有两个问题。
首先,你不记得&#39;#&#39;的位置。当你找到它时,你需要将Dir['/Volumes/.../*.bowtie.txt'].inject({}) do |memo, file|
memo[file] = File.readlines(file).select do |line|
line =~ /^[0-9]+\s*(\+|\-)/ # only those, matching
end.count
puts memo
memo
end
函数的返回值赋给std::string::find_first_of
。
其次,你要一直删除字符串的内容到你找到的位置。这会抛弃您从pos_key
函数获得的所有位置信息。
我认为这可能就是你所需要的:
std::string::find_first_of