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와 비교하는 것이 좋습니다.
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
string::npos
-1
비 위치를 나타내는 상수 (아마도 )입니다. find
패턴을 찾을 수 없을 때 메서드에 의해 반환됩니다 .
에 대한 문서 string::npos
내용 :
npos는 size_t 유형의 요소에 대해 가능한 가장 큰 값을 가진 정적 멤버 상수 값입니다.
반환 값으로 일반적으로 실패를 나타내는 데 사용됩니다.
이 상수는 실제로 -1 (모든 특성에 대해) 값으로 정의되며, size_t는 부호없는 정수 유형이기 때문에이 유형에 대해 표현 가능한 가장 큰 값이됩니다.
size_t
는 부호없는 변수이므로 '부호없는 값 =-1'은 자동으로 가능한 가장 큰 값이됩니다 size_t
. 18446744073709551615
string::size_type
find 함수의 반환 유형에 사용해야 합니다. 그렇지 않으면 비교가 string::npos
작동하지 않을 수 있습니다.
size_type
는 문자열 할당 자에 의해 정의되며 unsigned
정수 유형 이어야합니다 . 기본 할당자인 allocator는 type size_t
을 size_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
...
}
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");
요즘 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;
}
string :: npos의 값은 18446744073709551615입니다. 문자열이 없으면 반환되는 값입니다.
18446744073709551615
은 64 비트의 std::size_t
경우 일반적이며 최대 64 비트 부호없는 값입니다.