找子串

10 分钟

想知道一个短词是否出现在长字符串里,string 自带的 .find 最方便。它从左往右查,找到就返回子串第一次出现的下标,找不到返回特殊常量 string::npos

#include <string>
string s = "banana";
if (s.find("nan") != string::npos)
    cout << "有,位置在 " << s.find("nan");  // 位置 2
if (s.find("xyz") == string::npos)
    cout << "没找到";
size_t p = s.find("na", 3);   // 从下标 3 开始找,返回 4

判断存在与否,固定写法是和 string::npos 比较,复杂度大约 串长、 词长)。

最容易翻车的一处:find 找不到返回的是 npos(一个很大的无符号数),千万别写成 if(s.find(...)!=-1)if(s.find(...)>=0)——npos 本质是最大 size_t,这类比较会出错。正确写法只认 != string::npos。第二个参数可指定起始位置,配合循环能找出全部出现位置。

小纸条

s="banana" 里用 s.find("na") 找得到吗?

登录 后可看答案