什么是string :: npos的意思

语句string::npos在这里表示什么?

 found=str.find(str2); if (found!=string::npos) cout << "first 'needle' found at: " << int(found) << endl; 

这意味着没有find。

通常这样定义:

 static const size_t npos = -1; 

因为代码更清晰,所以最好和npos比较,而不是-1。

string::npos是一个表示非位置的常量(可能是-1 )。 当find模式时,它通过方法find返回。

string::npos文件说:

npos是一个静态成员常量值,对于size_ttypes的元素具有最大的可能值。

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

这个常量实际上是用值-1(对于任何特征)定义的,因为size_t是一个无符号整型,成为这种types最大的可表示值。

size_t是一个无符号variables,因此'unsigned value = – 1'会自动使它成为size_t的最大可能值:18446744073709551615

std::string::npos是实现定义的索引,它总是超出任何std::string实例的范围。 各种各样的std::string函数返回它或者接受它在string情况结束之后发出信号。 它通常是一些无符号的整数types,它的值通常是std::numeric_limits<std::string::size_type>::max ()这是(感谢标准整数促销)通常可以比较-1

如果在searchstring中找不到子string,将found npos

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

 idx == std::string::npos 

如果idx的值为-1 ,则idx和string::npostypes可能不同:

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

避免这种错误的一种方法是检查search是否直接失败:

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

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

 const int NPOS = -1; 

现在比较看起来有点不同,更方便:

 if (idx == NPOS) { // works almost always ... } 
 $21.4 - "static const size_type npos = -1;" 

它是由string函数返回指示错误/未find等

npos只是一个标记值,告诉你find()没有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");