C++中string::npos的一些用法总结

Android中的Service:Binder,Messenger,AIDL(2) 前言前面一篇博文介绍了关于Service的一些基本知识,包括service是什么,怎么创建一个service,创建了一个service之后如何启动它等等。在这一篇博文里有一些需要前一篇铺垫的东西,建议没有看过前一篇博文的同学先去看一下前一篇: Android中的Service:默默的奉献者 (1) 。但是在前一篇博文中也有一些遗漏的东西——主要是关于bindService()这一块的具体细节。由于这 阅读详情
一、关于npos的定义
在MSDN中有如下说明:
basic_string::npos
static const size_type npos = -1;//定义
The constant is the largest representable value of type size_type. It is assuredly larger than max_size(); hence it serves as either a very large value or as a special code.

以上的意思是npos是一个常数,表示size_t的最大值(Maximum value for size_t)。许多容器都提供这个东西,用来表示不存在的位置,类型一般是std::container_type::size_type。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>    
  2. #include <limits>    
  3. #include <string>    
  4. using namespace std;    
  5.     
  6. int main()    
  7. {    
  8.     size_t npos = -1;    
  9.     cout << "npos: " << npos << endl;    
  10.     cout << "size_t max: " << numeric_limits<size_t>::max() << endl;  
  11. }  

执行结果为:

                 npos:           4294967295

                 size_t max:  4294967295

可见他们是相等的,也就是说npos表示size_t的最大值


二、npos的用法
1、npos可以表示string的结束位子,是string::type_size 类型的,也就是find()返回的类型。find函数在找不到指定值得情况下会返回string::npos。举例如下(计算字符串中含有的不同字符的个数):
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>  
  2. #include <string>  
  3. using namespace std;  
  4. int main()  
  5. {  
  6.     string b;  
  7.     getline(cin,b);  
  8.     int count=0;  
  9.     for(int i=0;i<=127;i++)  
  10.         if(b.find(i)!=string::npos)  
  11.         count++;  
  12.     cout<<count;  
  13. }  
举例2:
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. string name("Annaqijiashe");  
  2. int pos=name.find("Anna");  
  3. if(pos==string::npos)       
  4. cout<<"Anna not found!\n";  
  5. else  cout<<"Anna found at pos:"<<pos<<endl;  
2、string::npos作为string的成员函数的一个长度参数时,表示“直到字符串结束(until the end of the string)”。例如:
  1. tmpname.replace(idx+1, string::npos, suffix);  
这里的string::npos就是一个长度参数,表示直到字符串的结束,配合idx+1表示,string的剩余部分。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <iostream>    
  2. #include <limits>    
  3. #include <string>    
  4. using namespace std;    
  5. int main()    
  6. {    
  7.     string filename = "test.cpp";    
  8.     cout << "filename : " << filename << endl;    
  9.     
  10.     size_t idx = filename.find('.');   //as a return value    
  11.     if(idx == string::npos)        
  12.     {    
  13.         cout << "filename does not contain any period!" << endl;    
  14.     }    
  15.     else    
  16.     {    
  17.         string tmpname = filename;    
  18.         tmpname.replace(idx + 1, string::npos, "xxx"); //string::npos作为长度参数,表示直到字符串结束    
  19.         cout << "repalce: " << tmpname << endl;    
  20.     }    
  21. }    
执行结果如下:

filename:test.cpp

replace: test.xxx


三、值得注意的地方:
1、npos的类型
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int idx = str.find("abc");  
  2. if (idx == string::npos)  
  3.   ...  
上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。因为 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) { ... }

2、string 类提供了 6 种查找函数,每种函数以不同形式的 find 命名。这些操作全都返回 string::size_type 类型的值,以下标形式标记查找匹配所发生的位置;或者返回一个名为 string::npos 的特殊值,说明查找没有匹配。string 类将 npos 定义为保证大于任何有效下标的值。


参考资料:

string::npos 无符号数的陷阱 

string::npos的一些说明

基于STM32设计的智能家居系统(采用ESP8266+OneNet云平台) 一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 云平台: 采用中国移动OneNet. 也可以采用腾讯、阿里云、华为云、百度天工物接入、机智云等等。 前面文章有讲解。 协议: 采用MQTT协议 开发软件:keil5 完整项目源码下载:https://download.youkuaiyun.com/download/xiaolong1126626497/19766925 二、包含的硬件与实... 阅读详情

相关推荐

用户消费行为分析(MapReduce实现,Hive分析)

一、题目要求 数据来自CDNow网站的一份用户购买CD明细,本数据集共有 6 万条 左右数据,数据为 CDNow 网站 1997年1月至1998年6月的用户行为 数据

紫烟的博客 3014

C++中string::npos的用法总结

C++中string::npos的用法总结

ONE_KICK的博客 1万+

hcaptcha-challenger:基于本地AI模型自动破解验证码的工程实践

验证码作为区分人类与机器的经典安全机制,其核心原理是通过图像识别、行为分析等交互式挑战来阻挡自动化程序。传统绕过方法依赖第三方打码平台或脚本,存在成本高、稳定性差的问题。随着多模态大语言模型和计算机视觉技术的发展,本地化AI求解成为新的技术方向,它通过集成YOLO、ResNet等模型,在本地完成图像语义理解,实现了高隐私、低成本、可进化的验证码自动化解决方案。这种范式尤其适用于需要大规模稳定处理网页交互的场景,如电商数据采集和社交媒体管理。hcaptcha-challenger项目正是这一理念的工程实践,它

weixin_42587866的博客 1028

string

C++;string的使用详解,持续更新编辑

April_25的博客 4385

STM32实战:如何快速移植野火PID调试助手协议到你的电机控制项目

本文详细解析了如何将野火PID调试助手协议快速移植到STM32电机控制项目中。通过深度剖析协议帧格式、数据解析逻辑及环形缓冲区应用,提供了从工程结构规划、核心函数适配到串口中断集成的完整移植步骤。文章还分享了协议健壮性增强、数据上报频率优化等高级调试技巧,帮助开发者构建稳定可靠的上位机调试通道,大幅提升PID参数整定效率。

weixin_29171129的博客 468

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1922

彻底搞懂C++中string::npos

C++手册里面给出的定义是这样的,string::npos就是一个公有的静态的常量类型的成员变量。使用前需要包含头文件。(-1);这里的size_type就是类型size_t,size_t是一个无符号整形,那么-1也就是其最大值。

andrewbytecoder 6865

双目立体成像(一)双目图片生成点云

利用左右目图片生成点云

qq_62964142的博客 4554

string::npos

string::npos的含义

bang___bang_的博客 1630

基于YOLO-world训练模型的完整教程:从数据准备到微调训练

本文提供了YOLO-world模型训练的完整教程,涵盖从环境配置到微调训练的全流程。首先介绍了YOLO-world项目的安装与配置步骤,包括依赖安装和CUDA环境设置;接着详细说明了数据集的准备方法,包括COCO格式数据集的组织结构和自定义数据集的类别定义;然后阐述了配置文件的修改要点,包括超参数调整和数据集路径设置;最后讲解了训练命令的使用方法及常见问题的解决方案。本教程旨在帮助读者快速掌握YOLO-world模型的训练技能,适用于计算机视觉领域的研究人员和开发者。

FJN110的博客 1108

华为OD机试真题2025双机位C卷 C++ 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 282

C++: string 中find函数的用法以及string::npos的含义

C++: string 中find函数的用法以及string::npos的含义标签:C++ string find函数 npos 字符串包含by 小威威问题:有两个字符串a、b, 现想判断a字符串是否包含b字符串,该如何设计程序?思路:此处需要用到string库中的find函数与npos参数。先说说string::npos参数: npos 是一个常数,用来表示不存在的位置,类型一般是std

linwh8的博客 3万+

前拉后推计划逻辑适用于哪些行业和企业规模?

《前拉后推计划逻辑的行业适用性分析》摘要:前拉后推计划逻辑(需求端后推锚定交付、供应端前拉匹配资源)最适用于需求波动大且具规模效益的行业,包括家具制造(定制化需求+批量运输)、机械装备(非标设备+部件采购)、消费电子(短周期产品+核心部件备货)及汽车配套(交期绑定+批量生产)等领域。该模式要求企业具备:1)独立计划部门;2)ERP/MES等信息系统;3)资源冗余能力,故更适配中型(1-10亿营收)和大型企业(10亿+)。小型企业需简化应用,仅聚焦关键环节。不适配需求稳定(如快消品)、无规模效益或短周期生产的

追随内心 144

C++字符串查找函数string::find()以及string::npos用法

1、string::find()函数:是一个字符或字符串查找函数,返回类型string::size_type。如果查找成功,返回按照查找规则找到的第一个字符或者子串的位置;如果查找失败,返回string::npos。 2、string::npos:是对类型为size_t的元素具有最大可能的值。当这个值在字符串成员函数中的长度或者子长度被使用时,该值表示“直到字符串结尾”。作为返回值他通常被用作表明...

波点兔的博客 3525

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++中string::find()函数和string::npos函数的使用

1. string::find()函数 &amp;&amp; string::npos函数介绍 string::find()函数:是一个字符或字符串查找函数,该函数有唯一的返回类型,即string::size_type,即一个无符号整形类型,可能是整数也可能是长整数。如果查找成功,返回按照查找规则找到的第一个字符或者子串的位置;如果查找失败,返回string::npos,即-1(当然打印出的结果...

zpznba的博客 302

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: C++中string erase函数的使用
下一篇: 去哪儿网笔试题分析
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值