Respostas:
Isso significa que não foi encontrado.
Geralmente é definido assim:
static const size_t npos = -1;
É melhor comparar com npos em vez de -1 porque o código é mais legível.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
e consigo pos:4294967295 npos: 4294967295
quando executo no Windows, mas no Mac eu consigo pos:4294967295 npos: 18446744073709551615
. Isso não parece certo ... bem, de qualquer forma, sugiro comparar com, em -1
vez destd::string::npos
string::npos
é uma constante (provavelmente -1
) que representa uma não posição. Ele é retornado pelo método find
quando o padrão não foi encontrado.
O documento para string::npos
diz:
npos é um valor constante de membro estático com o maior valor possível para um elemento do tipo size_t.
Como valor de retorno, geralmente é usado para indicar falha.
Esta constante é realmente definida com um valor de -1 (para qualquer característica), que porque size_t é um tipo integral sem sinal, torna-se o maior valor representável possível para este tipo.
size_t
é uma variável sem sinal, portanto, 'valor sem sinal = - 1' a torna automaticamente o maior valor possível para size_t
: 18446744073709551615
std::string::npos
é o índice definido pela implementação que está sempre fora dos limites de qualquer std::string
instância. Várias std::string
funções o retornam ou aceitam para sinalizar além do fim da situação da string. Geralmente é de algum tipo inteiro sem sinal e seu valor geralmente std::numeric_limits<std::string::size_type>::max ()
é (graças às promoções de inteiro padrão) geralmente comparável a -1
.
temos que usar string::size_type
para o tipo de retorno da função find, caso contrário, a comparação com string::npos
pode não funcionar.
size_type
, que é definido pelo alocador da string, deve ser um unsigned
tipo integral. O alocador padrão, alocador, usa o tipo size_t
como size_type
. Como -1
é convertido em um tipo integral sem sinal, npos é o valor máximo sem sinal de seu tipo. No entanto, o valor exato depende da definição exata do tipo size_type
. Infelizmente, esses valores máximos são diferentes. Na verdade, (unsigned long)-1
difere de (unsigned short)-
1 se o tamanho dos tipos for diferente. Assim, a comparação
idx == std::string::npos
pode resultar em falso se idx tiver o valor -1
e idx e string::npos
tiver tipos diferentes:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
Uma maneira de evitar esse erro é verificar se a pesquisa falha diretamente:
if (s.find("hi") == std::string::npos) {
...
}
No entanto, geralmente você precisa do índice da posição do caractere correspondente. Assim, outra solução simples é definir seu próprio valor assinado para npos:
const int NPOS = -1;
Agora a comparação parece um pouco diferente e ainda mais conveniente:
if (idx == NPOS) { // works almost always
...
}
npos é apenas um valor de token que informa que find () não encontrou nada (provavelmente -1 ou algo parecido). find () verifica a primeira ocorrência do parâmetro e retorna o índice no qual o parâmetro começa. Por exemplo,
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");
const estático size_t npos = -1;
Valor máximo para size_t
npos é um valor constante de membro estático com o maior valor possível para um elemento do tipo size_t.
Este valor, quando usado como o valor para um parâmetro len (ou sublen) em funções de membro de string, significa "até o final da string".
Como um valor de retorno, geralmente é usado para indicar nenhuma correspondência.
Essa constante é definida com um valor de -1, que como size_t é um tipo integral sem sinal, é o maior valor representável possível para esse tipo.
Uma resposta para os dias de C ++ 17, quando temos std::optional
:
Se você apertar os olhos um pouco e fingir que std::string::find()
retorna um std::optional<std::string::size_type>
(o que deveria ...) - então a condição se torna:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
O valor de string :: npos é 18446744073709551615. É um valor retornado se nenhuma string for encontrada.
18446744073709551615
seria típico para 64 bits std::size_t
, é o valor máximo sem sinal de 64 bits.