在此代码中string :: npos是什么意思?


91

std::string::npos在以下代码片段中,该短语是什么意思?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

Answers:


105

这意味着找不到。

通常定义如下:

static const size_t npos = -1;

最好与npos而不是-1进行比较,因为代码更易读。


3
比较== -1可能还会使某些人认为他们可以将其转换为<0,这是不一样的,并且将不起作用。
安迪·邓特

我只是想知道是否有人遇到过这个问题,或者仅仅是我...我在Windows中运行时cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;得到pos:4294967295 npos: 4294967295了,但是在Mac上却得到了pos:4294967295 npos: 18446744073709551615。这似乎不对...我建议以任何方式进行比较,-1而不是std::string::npos
user1135469 2013年

@ user1135469如果您看到codaddict贝娄(stackoverflow.com/a/3827997/752842)或塞巴斯蒂安·拉施卡(Sebastian Raschka)的答案,我认为您所得到的将是有道理的。并且我建议使用npos,因为我尝试使用-1且在我使用它的条件下它无法正常工作。
Dzyann

51

string::npos-1表示一个非位置的常数(可能是)。find找不到模式时,由方法返回。


15
+1,用于实际显示npos = no-pos派生,使其易于记住。很明显,一旦您知道它就不会考虑它,但是对于第一次看到这些字母的人来说,它可能不会单击...?
托尼·德罗伊

4
在47个级别上是错误的... npos是size_t,这表示它不能为负...真正的含义是max_index,对于18位
7446-744073709551615,64

25

文件string::npos说明:

npos是一个静态成员常量值,对于类型为size_t的元素,其最大值可能。

作为返回值,通常用于指示失败。

实际上,此常数定义为-1(对于任何特征),因为size_t是无符号整数类型,因此它成为该类型可能的最大可表示值。


17

size_t是一个无符号变量,因此“无符号值=-1”会自动使其size_t变为可能的最大值:18446744073709551615


对于32位编译器,size_t是unsigned int;64位编译器的unsigned long long int。将其设置为-1使其具有该无符号类型的max val。
sudheerbb

9

std::string::npos是实现定义的索引,该索引始终超出任何std::string实例的范围。各种std::string函数返回它或接受它以表示超出字符串情况结束的信号。它通常是一些无符号整数类型,其值通常std::numeric_limits<std::string::size_type>::max ()可以与相比(由于标准整数提升)-1


4

我们必须使用string::size_typefind函数的返回类型,否则与之比较string::npos可能不起作用。 size_type由字符串的分配器定义,必须是unsigned 整数类型。默认分配器allocator使用type size_t作为size_type。因为-1被转换为无符号整数类型,所以npos是其类型的最大无符号值。但是,确切的值取决于type的确切定义size_type。不幸的是,这些最大值不同。实际上,如果类型的大小(unsigned long)-1不同,(unsigned short)-则该值不同于1。因此,比较

idx == std::string::npos

如果idx具有值-1和idx并且string::npos具有不同的类型,则可能会产生false :

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}

避免此错误的一种方法是检查搜索是否直接失败:

if (s.find("hi") == std::string::npos) {
...
}

但是,通常需要匹配字符位置的索引。因此,另一个简单的解决方案是为npos定义自己的签名值:

const int NPOS = -1;

现在比较看起来有些不同,甚至更加方便:

if (idx == NPOS) { // works almost always
...
}

3

found如果无法npos在搜索字符串中找到子字符串,将被使用。


1
$21.4 - "static const size_type npos = -1;"

它由指示错误/未找到等的字符串函数返回。


0

npos只是一个令牌值,它告诉您find()找不到任何东西(可能是-1或类似的东西)。find()检查参数的第一次出现,并返回参数开始的索引。例如,

  string name = "asad.txt";
  int i = name.find(".txt");
  //i holds the value 4 now, that's the index at which ".txt" starts
  if (i==string::npos) //if ".txt" was NOT found - in this case it was, so  this condition is false
    name.append(".txt");

这段代码不会为“ asad.other”编写代码,因为find()不返回整数。
LogicMagic

0

静态const size_t npos = -1;

size_t的最大值

npos是一个静态成员常量值,对于类型为size_t的元素,其最大值可能。

该值用作字符串成员函数中len(或sublen)参数的值时,表示“直到字符串末尾”。

作为返回值,通常用于表示没有匹配项。

该常量的值定义为-1,这是因为size_t是无符号整数类型,因此它是此类型可能的最大可表示值。


0

当我们有C ++ 17这些天的答案时std::optional

如果您斜视一下并假装std::string::find()返回一个std::optional<std::string::size_type>(有点儿应该...)-那么条件变为:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}

0

string :: npos的值为18446744073709551615。如果未找到字符串,则返回其值。


实际值是实现定义的,无关紧要的。但是,实际上,该值18446744073709551615是64位的典型值std::size_t,它是最大的64位无符号值。
Alex Guteniev
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.