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;  
    }  
  • 相关阅读:
    ZYNQ. Interrupt(1)Private Timer
    RaspberryPi.1.开机与远程桌面
    ZYNQ. DMA基本用法
    ZYNQ. LwIP.PHY.KSZ9031RNX
    Verilog笔记.三段式状态机
    c语言.函数指针数组
    c语言学习笔记.链表.
    D3D基本框架:即D3D头文件分类
    win32窗口:关于鼠标定位位置偏移问题的原因及解决方法
    <转>C++基础知识: 引用
  • 原文地址:https://www.cnblogs.com/wft1990/p/6163753.html
Copyright © 2011-2022 走看看