c ++ string :: find_last_of返回任意大数

时间:2017-02-06 07:06:14

标签: c++ string

尝试使用find last获取最后一个'='的索引返回一个垃圾编号。

size_t index = str.find_last_of('=', 0);

这是字符串,其中有一个'='..

"page id=0 file="simsun.png" chars count=97"

如何找到最后一个'='的索引?

4 个答案:

答案 0 :(得分:6)

string::find_last_of()而言,指定pos表示搜索仅包含位于该位置的字符,忽略其后可能出现的任何字符。如果在给定这些限制的情况下无法找到,则会返回npos

可以在标准中找到完整的详细信息,例如C++11 21.4.7.5

  

21.4.7.5 basic_string::find_last_of [string :: find.last.of]

     

size_type find_last_of(
  const basic_string& str,
  size_type pos = npos
  ) const noexcept;

     

效果:如果可能,确定最高位置xpos,以便获得以下两个条件:

     
      
  • xpos <= posxpos < size();
  •   
  • traits::eq(at(xpos), str.at(I))表示由I控制的字符串的str元素。
  •   
     

如果函数可以为xpos确定这样的值,则返回: xpos。否则,返回npos

     

备注:使用traits::eq()

           

size_type find_last_of(
  charT c,
  size_type pos = npos
  ) const noexcept;

     

返回: find_last_of(basic_string<charT,traits,Allocator>(1,c),pos)

第一个项目符号点xpos <= pos导致此问题。除非您的字符串=启动,否则您的特定表达式将获得npos那是您看到的大数字,因为它是值-1的无符号变体。

如果你想找到最后一个字符,find_last_of()的正确形式是:

size_t index = str.find_last_of('=');

由于pos默认为npos,这意味着它会考虑整个字符串。

答案 1 :(得分:4)

我怀疑它是“随意的”,而是最有可能返回npos

如果你阅读,很容易理解为什么this find_last_of reference,其中pos参数为

  

搜索完成的位置

因此,当您将0作为职位时,您告诉find_last_of停止搜索第一个字符而不是最后一个字符。

简单的解决方案是不传递(可选)位置参数:

str.find_last_of('=')

当然要检查npos是否已退回。

答案 2 :(得分:0)

第二个论点是错误的,试试:

#include <string>
#include <iostream>
int main() 
{
    std::string str = "page id = 0 file = \"simsun.png\" chars count = 97";
    size_t index = str.find_last_of('=');
    std::cout << index << std::endl;
    return 0;
}

答案 3 :(得分:0)

最后一次使用 rfind() find_last_of()从末尾查找字符串中的字符

具体而言,您要求的是最后一次出现,所以请使用rfind()而不是find_last_of()

std::string str ("page id=0 file=\"simsun.png\" chars count=97");
std::string key ("=");
std::size_t found = str.rfind(key);