zoukankan      html  css  js  c++  java
  • string类find函数返回值判定

     string类find函数返回值判定

    代码示例

    #include<iostream>
    #include<cstring>
    using namespace std;
    int main()  
    {  
        static const size_t npos = -1; 
        string s = "Alice Bob Charlie";  
        size_t position;  
        position = s.find("none");  
        //position = s.find("Bob"); 
        if (position >= 0)  
            cout << "Found! position is : " << position << endl;  
        else  
            cout << "Not found!" << endl;  
    }  

    现象&后果

    程序运行结果输出"Found! position is : 18446744073709551615",但实际上所找的字符串"none"并不存在于字符串s中。

    Bug分析

    程序的目的是,在源字符串s中查找目的字符串,若找到,则显示"Found",并返回目标子串在源字符串中的位置;反之,若未找到,则返回"Not found"。string.find在未找到时会返回string::npos。

    在C++中常量npos是这样定义的:

    1. static const size_t npos = -1; 

    即常量npos定义的值为-1. 但又因为npos 的类型size_t是无符号整数类型,所以npos实际上是一个正数,并且是size_t类型的最大值。

    上述代码中,把find函数返回的值赋给size_t类型的变量position,而size_t类型的变量position是永远大于等于0,所以即使find返回npos,if条件也为true。

    正确的做法是在if条件中直接用npos作比较。

    正确代码

    #include<iostream>
    #include<cstring>
    using namespace std;
    int main()  
    {  
        static const size_t npos = -1; 
        string s = "Alice Bob Charlie";  
        size_t position;  
        position = s.find("none");  
        if (position !=string::npos)  
            cout << "Found! position is : " << position << endl;  
        else  
            cout << "Not found!" << endl;  
    }  
  • 相关阅读:
    RocketMq(一、双master模式集群搭建)
    activeMQ(二、与springboot集成)
    activeMQ(一、基础练习)
    oracle分区【转载】
    oracle索引
    实习 | 第一天
    再学ajax--第二天 | 基于php+mysql+ajax的表单注册、登录、注销
    再学ajax--第一天
    ECMAScript6入门学习--第一天
    关于px、pt、em、rem四个单位的解释
  • 原文地址:https://www.cnblogs.com/wft1990/p/6163753.html
Copyright © 2011-2022 走看看