Cụm từ std::string::npos
trong đoạn mã sau có nghĩa là gì?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Câu trả lời:
Nó có nghĩa là không tìm thấy.
Nó thường được định nghĩa như vậy:
static const size_t npos = -1;
Tốt hơn là so sánh với npos thay vì -1 vì mã dễ đọc hơn.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
và nhận được pos:4294967295 npos: 4294967295
khi tôi chạy nó trong Windows nhưng trên Mac thì tôi nhận được pos:4294967295 npos: 18446744073709551615
. Đó dường như không đúng ... cũng bất cứ cách nào tôi khuyên bạn nên so sánh để -1
thay vìstd::string::npos
string::npos
là một hằng số (có thể -1
) đại diện cho một vị trí không phải. Nó được trả về theo phương thức find
khi không tìm thấy mẫu.
Tài liệu cho string::npos
biết:
npos là một hằng số thành viên tĩnh có giá trị lớn nhất có thể cho một phần tử kiểu size_t.
Là một giá trị trả về, nó thường được sử dụng để chỉ ra sự thất bại.
Hằng số này thực sự được xác định với giá trị -1 (đối với bất kỳ đặc điểm nào), vì size_t là kiểu tích phân không dấu, trở thành giá trị có thể biểu diễn lớn nhất cho kiểu này.
size_t
là một biến không dấu, do đó, 'giá trị không dấu = - 1' tự động làm cho nó trở thành giá trị lớn nhất có thể cho size_t
: 18446744073709551615
std::string::npos
là chỉ mục được xác định thực thi luôn nằm ngoài giới hạn của bất kỳ std::string
trường hợp nào . Các std::string
hàm khác nhau trả về hoặc chấp nhận nó để báo hiệu vượt quá sự kết thúc của tình huống chuỗi. Nó thường thuộc một số kiểu số nguyên không dấu và giá trị của nó thường std::numeric_limits<std::string::size_type>::max ()
là (nhờ vào các khuyến mãi số nguyên chuẩn) thường được so sánh với -1
.
chúng ta phải sử dụng string::size_type
cho kiểu trả về của hàm find nếu không so sánh với string::npos
có thể không hoạt động.
size_type
, được xác định bởi bộ cấp phát của chuỗi, phải là một unsigned
kiểu tích phân. Bộ cấp phát mặc định, bộ cấp phát, sử dụng loại size_t
là size_type
. Vì -1
được chuyển đổi thành kiểu tích phân không dấu, npos là giá trị không dấu lớn nhất của kiểu nó. Tuy nhiên, giá trị chính xác phụ thuộc vào định nghĩa chính xác của loại size_type
. Thật không may, các giá trị tối đa này khác nhau. Trên thực tế, (unsigned long)-1
khác với (unsigned short)-
1 nếu kích thước của các loại khác nhau. Như vậy, so sánh
idx == std::string::npos
có thể mang lại false nếu idx có giá trị -1
và idx và string::npos
có các loại khác nhau:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
Một cách để tránh lỗi này là kiểm tra xem tìm kiếm có thất bại trực tiếp hay không:
if (s.find("hi") == std::string::npos) {
...
}
Tuy nhiên, thường bạn cần chỉ số của vị trí ký tự phù hợp. Do đó, một giải pháp đơn giản khác là xác định giá trị có dấu của riêng bạn cho npos:
const int NPOS = -1;
Bây giờ so sánh trông hơi khác một chút và thậm chí còn thuận tiện hơn:
if (idx == NPOS) { // works almost always
...
}
npos chỉ là một giá trị mã thông báo cho bạn biết rằng find () không tìm thấy gì (có thể là -1 hoặc tương tự như vậy). find () kiểm tra lần xuất hiện đầu tiên của tham số và trả về chỉ mục mà tại đó tham số bắt đầu. Ví dụ,
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");
static const size_t npos = -1;
Giá trị tối đa cho size_t
npos là một hằng số thành viên tĩnh có giá trị lớn nhất có thể cho một phần tử kiểu size_t.
Giá trị này, khi được sử dụng làm giá trị cho tham số len (hoặc sublen) trong các hàm thành viên của chuỗi, có nghĩa là "cho đến cuối chuỗi".
Là một giá trị trả về, nó thường được sử dụng để biểu thị không có kết quả phù hợp nào.
Hằng số này được xác định với giá trị -1, vì size_t là kiểu tích phân không dấu, nên nó là giá trị có thể biểu diễn lớn nhất cho kiểu này.
Câu trả lời cho những ngày này của C ++ 17, khi chúng ta có std::optional
:
Nếu bạn nheo mắt một chút và giả vờ std::string::find()
trả về một std::optional<std::string::size_type>
(mà nó giống như ...) - thì điều kiện sẽ trở thành:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
Giá trị của chuỗi :: npos là 18446744073709551615. Giá trị của nó được trả về nếu không tìm thấy chuỗi nào.
18446744073709551615
sẽ là điển hình cho 64-bit std::size_t
, đó là giá trị không dấu tối đa 64-bit.