尝试使用find last获取最后一个'='的索引返回一个垃圾编号。
size_t index = str.find_last_of('=', 0);
这是字符串,其中有一个'='..
"page id=0 file="simsun.png" chars count=97"
如何找到最后一个'='的索引?
答案 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 <= pos
和xpos < 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);