¿Qué significa la frase std::string::npos
en el siguiente fragmento de código?
found = str.find(str2);
if (found != std::string::npos)
std::cout << "first 'needle' found at: " << int(found) << std::endl;
Respuestas:
Significa no encontrado.
Normalmente se define así:
static const size_t npos = -1;
Es mejor comparar con npos en lugar de -1 porque el código es más legible.
cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;
y obtengo pos:4294967295 npos: 4294967295
cuando lo ejecuto en Windows, pero en Mac obtengo pos:4294967295 npos: 18446744073709551615
. Eso no parece correcto ... bueno, de cualquier manera, sugiero comparar con en -1
lugar destd::string::npos
string::npos
es una constante (probablemente -1
) que representa una no posición. Se devuelve por método find
cuando no se encontró el patrón.
El documento para string::npos
dice:
npos es un valor constante de miembro estático con el mayor valor posible para un elemento de tipo size_t.
Como valor de retorno, generalmente se usa para indicar falla.
Esta constante en realidad se define con un valor de -1 (para cualquier rasgo), que debido a que size_t es un tipo integral sin signo, se convierte en el valor representable más grande posible para este tipo.
size_t
es una variable sin signo, por lo que 'valor sin signo = - 1' lo convierte automáticamente en el valor más grande posible para size_t
: 18446744073709551615
std::string::npos
es un índice definido por la implementación que siempre está fuera de los límites de cualquier std::string
instancia. Varias std::string
funciones lo devuelven o lo aceptan para señalar más allá del final de la situación de la cadena. Suele ser de algún tipo de entero sin signo y su valor suele std::numeric_limits<std::string::size_type>::max ()
ser comparable (gracias a las promociones de enteros estándar) a -1
.
tenemos que usar string::size_type
para el tipo de retorno de la función de búsqueda, de lo contrario, la comparación con string::npos
podría no funcionar.
size_type
, que está definido por el asignador de la cadena, debe ser un unsigned
tipo integral. El asignador predeterminado, asignador, usa el tipo size_t
como size_type
. Debido a que -1
se convierte en un tipo integral sin signo, npos es el valor máximo sin signo de su tipo. Sin embargo, el valor exacto depende de la definición exacta de tipo size_type
. Desafortunadamente, estos valores máximos difieren. De hecho, (unsigned long)-1
difiere de (unsigned short)-
1 si el tamaño de los tipos es diferente. Por tanto, la comparación
idx == std::string::npos
podría producir falso si idx tiene el valor -1
y idx y string::npos
tienen diferentes tipos:
std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}
Una forma de evitar este error es comprobar si la búsqueda falla directamente:
if (s.find("hi") == std::string::npos) {
...
}
Sin embargo, a menudo necesita el índice de la posición del carácter coincidente. Por lo tanto, otra solución simple es definir su propio valor firmado para npos:
const int NPOS = -1;
Ahora la comparación se ve un poco diferente e incluso más conveniente:
if (idx == NPOS) { // works almost always
...
}
npos es solo un valor de token que le dice que find () no encontró nada (probablemente -1 o algo así). find () comprueba la primera aparición del parámetro y devuelve el índice en el que comienza el parámetro. Por ejemplo,
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");
estática const size_t npos = -1;
Valor máximo para size_t
npos es un valor constante de miembro estático con el mayor valor posible para un elemento de tipo size_t.
Este valor, cuando se usa como valor para un parámetro len (o subblen) en las funciones miembro de la cadena, significa "hasta el final de la cadena".
Como valor de retorno, generalmente se usa para indicar que no hay coincidencias.
Esta constante se define con un valor de -1, que debido a que size_t es un tipo integral sin signo, es el valor representable más grande posible para este tipo.
Una respuesta para estos días de C ++ 17, cuando tenemos std::optional
:
Si entrecierra los ojos un poco y finge que std::string::find()
devuelve un std::optional<std::string::size_type>
(que debería ser ...), entonces la condición se convierte en:
auto position = str.find(str2);
if ( position.has_value() ) {
std::cout << "first 'needle' found at: " << found.value() << std::endl;
}
El valor de string :: npos es 18446744073709551615. Es un valor devuelto si no se encuentra una cadena.
18446744073709551615
sería típico para 64 bits std::size_t
, es un valor máximo sin signo de 64 bits.