zoukankan      html  css  js  c++  java
  • C++中string.find()函数与string::npos

    先说说string::npos参数: 
    npos 是一个常数,用来表示不存在的位置,类型一般是std::container_type::size_type 许多容器都提供这个东西。取值由实现决定,一般是-1,这样做,就不会存在移植的问题了。 
    再来说说find函数: 
    find函数的返回值是整数,假如字符串存在包含关系,其返回值必定不等于npos,但如果字符串不存在包含关系,那么返回值就一定是npos。所以不难想到用if判断语句来实现!

    查找字符串a是否包含子串b,
    不是用strA.find(strB) > 0而是strA.find(strB) != string:npos
    string::size_type pos = strA.find(strB);
    if(pos != string::npos){}
    -------------------------------------------
    int idx = str.find("abc");
    if (idx == string::npos)
    ...
    上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。
    npos 是这样定义的:
    static const size_type npos = -1;

    因为 string::size_type (由字符串配置器 allocator 定义) 描述的是 size,故需为无符号整数型别。因为缺省配置器以型别 size_t 作为 size_type,于是 -1 被转换为无符号整数型别,npos 也就成了该型别的最大无符号值。不过实际数值还是取决于型别 size_type 的实际定义。不幸的是这些最大值都不相同。事实上,(unsigned long)-1 和 (unsigned short)-1 不同(前提是两者型别大小不同)。因此,比较式 idx == string::npos 中,如果 idx 的值为-1,由于 idx 和字符串string::npos 型别不同,比较结果可能得到 false。
    要想判断 find() 的结果是否为npos,最好的办法是直接比较:

    if (str.find("abc") == string::npos) { ... }

    错误:if(str.find("abc") ) 
    注:找不到abc会返回-1,不为0为True。0为False 

  • 相关阅读:
    Eclipse中jsp、js文件编辑时,卡死现象解决汇总
    环境安装备忘录 Nginx
    环境安装备忘录 Redis redis-slave-端口号.conf
    环境安装备忘录 Redis redis-common.conf
    环境安装备忘录 Redis
    Leetcode 131 Palindrome Partitioning(DFS思路)
    排序算法之快速排序(Quick Sort) -- 适用于Leetcode 75 Sort Colors
    谈STL的重要应用与实现
    二分图匹配相关问题
    理解操作系统相关知识
  • 原文地址:https://www.cnblogs.com/zl1991/p/7262130.html
Copyright © 2011-2022 走看看