2010-09-30 23 views
56

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; 

Respuesta

58

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.

+0

Gracias a todos por esta información ... – boom

+3

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

+0

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

2

found será npos en caso de error al encontrar la subcadena en la cadena de búsqueda.

39

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.

+12

+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 ... –

+1

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

6

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.

19

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.

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

Se devuelto por las funciones de cadena que indica el error/no encontrado etc.

12

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

2

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

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