如何指向std :: string中固定位置的分隔符

时间:2015-08-17 16:34:06

标签: c++ string find std

说我有文字说'#'作为分隔符。 例子

 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 ;

2 个答案:

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