이 코드에서 string :: npos는 무엇을 의미합니까?


91

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

found = str.find(str2);

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

답변:


106

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

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

static const size_t npos = -1;

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


3
== -1을 비교하면 일부 사람들은 동일한 것이 아니며 작동하지 않는 <0으로 변환 할 수 있다고 생각할 수도 있습니다.
앤디 덴트

누군가가 이것을 접했는지 궁금하거나 나뿐입니까 ... Windows에서 실행할 때 실행 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
user1135469

@ user1135469 codaddict 벨로우 ( stackoverflow.com/a/3827997/752842 ) 또는 Sebastian Raschka 의 대답을 본다면 당신이 얻는 것이 의미가 있다고 생각합니다. 그리고 npos를 사용하는 것이 좋습니다. -1을 사용해 보았지만 사용중인 조건에서 제대로 작동하지 않았기 때문입니다.
Dzyann 2013

51

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


15
+1은 실제로 기억하기 쉽게하는 npos = no-pos 파생을 표시합니다. 한 번 알았을 때 생각하지 않을 것이 분명하지만 처음으로 그 편지를 보는 사람에게는 클릭하지 않을 수 있습니다 ...?
Tony Delroy

4
47 개 레벨에서 잘못됨 ... npos는 size_t, 음수가 될 수 없음을 의미합니다 ... 실제 의미는 max_index, 64 비트 size_t의 경우
18446744073709551615

25

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

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

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

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


17

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


size_t는 32 비트 컴파일러의 unsigned int입니다. 64 비트 컴파일러 용 unsigned long long int .. -1로 설정하면 해당 unsigned 유형의 최대 값을 갖게됩니다.
sudheerbb

9

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


4

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

3

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


1
$21.4 - "static const size_type npos = -1;"

오류 / 찾을 수 없음 등을 나타내는 문자열 함수에 의해 반환됩니다.


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");

find ()가 int를 반환하지 않기 때문에이 코드는 "asad.other"를 검색하지 않습니다.
LogicMagic

0

정적 const size_t npos = -1;

size_t의 최대 값

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

이 값은 문자열의 멤버 함수에서 len (또는 sublen) 매개 변수에 대한 값으로 사용될 때 "문자열 끝까지"를 의미합니다.

반환 값으로 일반적으로 일치하는 항목이 없음을 나타내는 데 사용됩니다.

이 상수는 -1 값으로 정의되며, size_t는 부호없는 정수 유형이므로이 유형에 대해 표현 가능한 가장 큰 값입니다.


0

요즘 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;
}

0

string :: npos의 값은 18446744073709551615입니다. 문자열이 없으면 반환되는 값입니다.


실제 값은 구현이 정의되고 관련이 없습니다. 그러나 실제로 값 18446744073709551615은 64 비트의 std::size_t경우 일반적이며 최대 64 비트 부호없는 값입니다.
Alex Guteniev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.