Lo que hace la declaración string::npos
significa aquí¿Qué significa string :: npos
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
Lo que hace la declaración string::npos
significa aquí¿Qué significa string :: npos
found=str.find(str2);
if (found!=string::npos)
cout << "first 'needle' found at: " << int(found) << endl;
Significa no se encontró.
por lo general es definido así:
static const size_t npos = -1;
Es mejor comparar con las NPO en lugar de -1 debido a que el código es más legible.
found
será npos
en caso de error al encontrar la subcadena en la cadena de búsqueda.
string::npos
es una constante (probablemente -1
) que representa una posición no. Es devuelto por el método find
cuando no se encontró el patrón.
+1 para mostrar realmente la derivación npos = no-pos que hace que sea fácil de recordar. Es tan obvio que no lo pensarías una vez que lo supieras, pero para alguien que vea esas letras por primera vez, puede que no haga clic ... –
incorrecto en 47 niveles ... npos es de size_t, significa que no puede ser negativo ... el significado real es max_index, 18446744073709551615 para 64 bit size_t – NoSenseEtAl
std::string::npos
es un índice definido por la implementación que siempre está fuera de los límites de cualquier instancia de std::string
. Diversas funciones std::string
lo devuelven o lo aceptan para señalar más allá del final de la situación de cadena. Por lo general, es de tipo entero sin signo y su valor suele ser std::numeric_limits<std::string::size_type>::max()
que es (gracias a las promociones enteras estándar) generalmente comparable a -1
.
El documento para string::npos
dice:
npos es un valor constante miembro estático con el mayor valor posible para un elemento de tipo size_t.
Como valor de retorno, generalmente se usa para indicar un error.
Esta constante se define realmente con un valor de -1 (para cualquier rasgo), que debido a que size_t es un tipo integral sin signo, se convierte en el mayor valor representable posible para este tipo.
$21.4 - "static const size_type npos = -1;"
Se devuelto por las funciones de cadena que indica el error/no encontrado etc.
size_t
es una variable sin signo, por lo tanto 'valor sin signo = - 1' hace automáticamente el mayor valor posible para size_t
: 18446744073709551615
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 se define mediante el asignador de la cadena, debe ser un tipo integral unsigned
. El asignador predeterminado, asignador, utiliza el tipo size_t
como size_type
. Como -1
es convertido 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 del 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 lo tanto, la comparación
idx == std::string::npos
pudo rendir falso si IDX tiene el valor -1
y IDX y string::npos
tener 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 sencilla es definir su propio valor con signo de npos:
const int NPOS = -1;
Ahora la comparación se ve un poco diferente y aún más conveniente:
if (idx == NPOS) { // works almost always
...
}
npos es sólo un valor simbólico que dice usted que encuentra() 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");
Gracias a todos por esta información ... – boom
Comparando == -1 podría hacer también hacer que algunas personas piensan que pueden convertir eso en <0, lo que no es lo mismo y no va a funcionar. –
Solo me pregunto si alguien se ha encontrado con esto, o solo soy yo ... Ejecuto 'cout <<" pos: "<< str.find (" not in the string ") <<" npos: "<< std :: string :: npos; 'y get' 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 '-1' en lugar de' std :: string :: npos' – user1135469