O que a frase std::string::npos
significa no seguinte trecho de código?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
c++
stdstring
c++-standard-library
estrondo
fonte
fonte
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
e consigopos:4294967295 npos: 4294967295
quando executo no Windows, mas no Mac eu consigopos: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étodofind
quando o padrão não foi encontrado.fonte
O documento para
string::npos
diz:fonte
size_t
é uma variável sem sinal, portanto, 'valor sem sinal = - 1' a torna automaticamente o maior valor possível parasize_t
: 18446744073709551615fonte
std::string::npos
é o índice definido pela implementação que está sempre fora dos limites de qualquerstd::string
instância. Váriasstd::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 geralmentestd::numeric_limits<std::string::size_type>::max ()
é (graças às promoções de inteiro padrão) geralmente comparável a-1
.fonte
temos que usar
string::size_type
para o tipo de retorno da função find, caso contrário, a comparação comstring::npos
pode não funcionar.size_type
, que é definido pelo alocador da string, deve ser umunsigned
tipo integral. O alocador padrão, alocador, usa o tiposize_t
comosize_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 tiposize_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çãopode resultar em falso se idx tiver o valor
-1
e idx estring::npos
tiver tipos diferentes:Uma maneira de evitar esse erro é verificar se a pesquisa falha diretamente:
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:
Agora a comparação parece um pouco diferente e ainda mais conveniente:
fonte
found
seránpos
no caso de falha em encontrar a substring na string de pesquisa.fonte
Ele é retornado por funções de string indicando erro / não encontrado etc.
fonte
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,
fonte
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.
fonte
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 umstd::optional<std::string::size_type>
(o que deveria ...) - então a condição se torna:fonte
O valor de string :: npos é 18446744073709551615. É um valor retornado se nenhuma string for encontrada.
fonte
18446744073709551615
seria típico para 64 bitsstd::size_t
, é o valor máximo sem sinal de 64 bits.