이 코드에서 string :: npos는 무엇을 의미합니까? 니펫에서이 문구 는 무엇을 의미합니까? found = str.find(str2); if

std::string::npos다음 코드 스 니펫에서이 문구 는 무엇을 의미합니까?

found = str.find(str2);

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


답변

찾을 수 없음을 의미합니다.

일반적으로 다음과 같이 정의됩니다.

static const size_t npos = -1;

코드가 더 읽기 쉽기 때문에 -1 대신 npos와 ​​비교하는 것이 좋습니다.


답변

string::npos-1비 위치를 나타내는 상수 (아마도 )입니다. find패턴을 찾을 수 없을 때 메서드에 의해 반환됩니다 .


답변

에 대한 문서 string::npos내용 :

npos는 size_t 유형의 요소에 대해 가능한 가장 큰 값을 가진 정적 멤버 상수 값입니다.

반환 값으로 일반적으로 실패를 나타내는 데 사용됩니다.

이 상수는 실제로 -1 (모든 특성에 대해) 값으로 정의되며, size_t는 부호없는 정수 유형이기 때문에이 유형에 대해 표현 가능한 가장 큰 값이됩니다.


답변

size_t는 부호없는 변수이므로 ‘부호없는 값 =-1’은 자동으로 가능한 가장 큰 값이됩니다 size_t. 18446744073709551615


답변

std::string::npos항상 모든 std::string인스턴스 의 범위를 벗어난 구현 정의 인덱스입니다 . 다양한 std::string함수는 그것을 반환하거나 문자열 상황의 끝을 넘어서 신호를 보내기 위해 받아들입니다. 일반적으로 부호없는 정수 유형이며 해당 값은 일반적으로 std::numeric_limits<std::string::size_type>::max ()(표준 정수 승격 덕분에) 일반적으로 -1.


답변

string::size_typefind 함수의 반환 유형에 사용해야 합니다. 그렇지 않으면 비교가 string::npos작동하지 않을 수 있습니다.
size_type는 문자열 할당 자에 의해 정의되며 unsigned
정수 유형 이어야합니다 . 기본 할당자인 allocator는 type size_tsize_type. -1부호없는 정수 유형으로 변환 되기 때문에 npos는 해당 유형의 부호없는 최대 값입니다. 그러나 정확한 값은 type의 정확한 정의에 따라 다릅니다 size_type. 불행히도이 최대 값은 다릅니다. 사실 (unsigned long)-1과 다른 (unsigned short)-한 경우 유형 다릅니다의 크기입니다. 따라서 비교

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
...
}

답변

found될 것입니다 npos실패의 경우에하면 검색 문자열에서 문자열을 찾을 수 있습니다.