声明string::npos
在这里意味着什么
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
答案 0 :(得分:75)
这意味着没找到。
通常定义如下:
static const size_t npos = -1;
最好与npos而不是-1进行比较,因为代码更清晰。
答案 1 :(得分:46)
string::npos
是一个代表非位置的常量(可能是-1
)。当找不到模式时,它由方法find
返回。
答案 2 :(得分:21)
string::npos
的文件说:
npos是一个静态成员常量值,对于size_t类型的元素具有最大可能值。
作为返回值,它通常用于表示失败。
此常量实际上定义为值-1(对于任何特征),因为size_t是无符号整数类型,因此成为此类型的最大可表示值。
答案 3 :(得分:14)
size_t
是无符号变量,因此'unsigned value = - 1'会自动使其成为size_t
的最大可能值:18446744073709551615
答案 4 :(得分:8)
std::string::npos
是实现定义的索引,它始终超出任何std::string
实例的范围。各种std::string
函数返回它或接受它在字符串情况结束后发出信号。它通常是一些无符号整数类型,其值通常为std::numeric_limits<std::string::size_type>::max ()
,这是(由于标准整数提升)通常与-1
相当。
答案 5 :(得分:3)
我们必须使用string::size_type
作为查找函数的返回类型,否则与string::npos
的比较可能不起作用。
size_type
,由字符串的分配器定义,必须是unsigned
积分型。默认分配器allocator使用size_t
类型作为size_type
。因为-1
是
转换为无符号整数类型,npos是其类型的最大无符号值。然而,
确切的值取决于类型size_type
的确切定义。不幸的是,这些最大
价值观不同。事实上,如果(unsigned long)-1
的大小不同,则(unsigned short)-
与idx == std::string::npos
1不同
类型不同。因此,比较
-1
如果idx的值为string::npos
且idx和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) {
...
}
避免此错误的一种方法是检查搜索是否直接失败:
const int NPOS = -1;
但是,通常需要匹配字符位置的索引。因此,另一个简单的解决方 是为npos定义你自己的签名值:
if (idx == NPOS) { // works almost always
...
}
现在比较看起来有点不同,甚至更方便:
{{1}}
答案 6 :(得分:2)
found
将为npos
。
答案 7 :(得分:1)
$21.4 - "static const size_type npos = -1;"
由字符串函数返回,表示错误/未找到等。
答案 8 :(得分:1)
string :: npos的值为18446744073709551615。如果未找到字符串,则返回其值。
答案 9 :(得分: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");
答案 10 :(得分:0)
static const size_t npos = -1;
size_t的最大值
npos是一个静态成员常量值,对于size_t类型的元素,该值可能为最大值。
该值用作字符串成员函数中len(或sublen)参数的值时,表示“直到字符串结尾”。
作为返回值,通常用于表示没有匹配项。
此常量定义为值-1,这是因为size_t是无符号整数类型,因此它是此类型可能的最大可表示值。
答案 11 :(得分:0)
当我们有了std::optional
时,这就是C ++ 17的答案:
如果您斜视一下并假装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;
}