std::string::find() 和 std::string::npos

npos是一个常数,用来表示不存在的位置,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) { ... }

(EOF)

时间: 2024-10-02 11:36:54

std::string::find() 和 std::string::npos的相关文章

实战c++中的string系列--std:vector<char> 和std:string相互转换(vector to stringstream)

有时候也会遇到std:vector与转std:string 相互转换的情况. 首先看一下vector<char>如何转string: std::vector<char> *data = response->getResponseData(); std::string res; //方法一 for (int i = 0;i<data->size();++i) { res+=(*data)[i]; } res+='\0'; std:cout << res;

no matching function for call to ‘std::basic_string&lt;char&gt;::assign(std::string&amp;, int)

使用string中的assign赋值函数报错,代码为: text0.assign(line,i+1); 其中text0与line都为string类型 最后发现assign函数的原型为 string &assign(const char *s,int n); 将代码改为以下即可 text0.assign(line.c_str(),i+1); 附  assign函数 string &operator=(const string &s);//把字符串s赋给当前字符串 string &am

C++ string的查找函数和npos特殊值

STL中的string有6个查找函数: 1.find() 2.rfind() 从最后一个字符开始往前找. 3.find_first_of() 4.find_not_first_of() 5.find_last_of() 6.find_not_last_of() 所有这些查找函数返回值都是size_type类型(找到了)或者是一个名为 string::npos的特殊值(没找到). string::npos常用来表示没找到的结果或者string类型的末尾. #include <iostream>

C++中string.find()函数,string.find_first_of函数与string::npos

查找字符串a是否包含子串b,不是用strA.find(strB) > 0而是strA.find(strB) != string:nposstring::size_type pos = strA.find(strB);if(pos != string::npos){}-------------------------------------------int idx = str.find("abc");if (idx == string::npos)...上述代码中,idx的类型被

std::和using namespace std;

std是标准命名空间名称 相同点: std::和using namespace std:的意思是一样的,都表示使用命名空间std: 不同点: 放在程序中的位置不同 1. using  namespace  std:头文件如果包含了#include<iostream>,那么在头文件下方写上using  namespace  std:2.std::头文件如果包含了#include<iostream>,但是没有在头文件下方写上using  namespace  std:那么在使用标准输入

C++: string 转 int ;string转float;int 转string;double转char*

1.string转int std::string str1="700" int bid_v1 = atoi(str1.c_str()); 2.string转float std::string str2="6.78" float bid_p1 = atof(str2.c_str()); 3.int 转string int n =789; char t[256]; sprintf(t, "%d", n); string s(t) 4.double转c

java中String s="abc"及String s=new String("abc")详解

1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配内存,存取速度较慢. ==是判断

使用std::ios::tie与std::ios_base::sync_with_stdio加速流

std::ios_base::sync_with_stdio static bool sync_with_stdio( bool sync = true ); 与cstdio流[静态]切换同步 打开或关闭所有的标准iostream流与它们对于的标准C流之间的同步. 实际上,这意味着C++和C流使用相同的缓冲区,因此,可以自由地混合使用流.同步C++标准流可以确保线程安全. 默认情况下,iostream对象和cstdio流同步.如果同步关闭,C++标准流独立地缓冲输入输出,在某些情况下,这是相当快

&#39;hello world&#39;, String(&#39;hello world&#39;), new String(&#39;hello world&#39;)

http://www.queness.com/post/9806/5-missing-javascript-number-format-functions 这篇文章介绍5种常用的数字转换格式 但是里面有一个小小的不好的编程习惯 就是在把数字转成字符串的时候 使用了 var s = new String(xxx) 这在 JSLint 中报错  Do not  use String as a conctruct https://jslinterrors.com/do-not-use-a-as-a-c

collection.toArray(new String[0])中new String[0]的作用

new string[0]的作用 比如:String[] result = set.toArray(new String[0]); Collection的公有方法中,toArray()是比较重要的一个. 但是使用无参数的toArray()有一个缺点,就是转换后的数组类型是Object[]. 虽然Object数组也不是不能用,但当你真的想用一个具体类型的数组,比如String[]时,问题就来了.而把Object[]给cast成 String[]还是很麻烦的,需要用到这个: String[] str