Cosa significa string :: npos in questo codice?


91

Cosa significa la frase std::string::nposnel seguente frammento di codice?

found = str.find(str2);

if (found != std::string::npos)
    std::cout << "first 'needle' found at: " << int(found) << std::endl;

Risposte:


105

Significa non trovato.

Di solito è definito così:

static const size_t npos = -1;

È meglio confrontare con npos invece di -1 perché il codice è più leggibile.


3
Confrontare == -1 potrebbe anche far pensare ad alcune persone di poterlo convertire in <0 che NON è la stessa cosa e non funzionerà.
Andy Dent

Mi chiedevo solo se qualcuno si è imbattuto in questo, o sono solo io ... Corro cout<<"pos: "<<str.find("not in the string")<<" npos: "<<std::string::npos;e ottengo pos:4294967295 npos: 4294967295quando lo eseguo in Windows ma su Mac ottengo pos:4294967295 npos: 18446744073709551615. Non sembra giusto ... beh in ogni caso suggerisco di confrontare con -1invece distd::string::npos
user1135469

@ user1135469 se si vede la risposta di codaddict soffietto ( stackoverflow.com/a/3827997/752842 ) o di Sebastian Raschka, penso che quello che hai trovato avrà senso. E consiglierei di usare npos, perché ho provato a usare -1 e non funzionava correttamente nelle condizioni in cui lo stavo usando.
Dzyann

50

string::nposè una costante (probabilmente -1) che rappresenta una non posizione. Viene restituito dal metodo findquando il modello non è stato trovato.


15
+1 per mostrare effettivamente la derivazione npos = no-pos che lo rende facile da ricordare. È così ovvio che non ci penseresti una volta che lo sai, ma per qualcuno che vede quelle lettere per la prima volta potrebbe non fare clic ...?
Tony Delroy

4
sbagliato su 47 livelli ... npos è di size_t, significa che non può essere negativo ... il vero significato è max_index, 18446744073709551615 per 64 bit size_t
NoSenseEtAl

25

Il documento per string::nposdice:

npos è un valore costante del membro statico con il valore massimo possibile per un elemento di tipo size_t.

Come valore di ritorno viene solitamente utilizzato per indicare un errore.

Questa costante è effettivamente definita con un valore di -1 (per qualsiasi tratto), che poiché size_t è un tipo integrale senza segno, diventa il valore rappresentabile più grande possibile per questo tipo.


17

size_tè una variabile senza segno, quindi "valore senza segno = - 1" la rende automaticamente il valore più grande possibile per size_t: 18446744073709551615


size_t è un int senza segno per il compilatore a 32 bit; unsigned long long int per il compilatore a 64 bit .. Impostandolo a -1 fa avere il valore massimo di quel tipo senza segno.
sudheerbb

9

std::string::nposè un indice definito dall'implementazione che è sempre fuori dai limiti di qualsiasi std::stringistanza. Diverse std::stringfunzioni lo restituiscono o lo accettano per segnalare oltre la fine della situazione di stringa. Di solito è di un tipo intero senza segno e il suo valore è std::numeric_limits<std::string::size_type>::max ()solitamente paragonabile (grazie alle promozioni di numeri interi standard) a -1.


4

dobbiamo usare string::size_typeper il tipo di ritorno della funzione find altrimenti il ​​confronto con string::npospotrebbe non funzionare. size_type, che è definito dall'allocatore della stringa, deve essere un unsigned tipo integrale. L'allocatore predefinito, allocatore, utilizza il tipo size_tcome size_type. Poiché -1viene convertito in un tipo integrale senza segno, npos è il valore massimo senza segno del suo tipo. Tuttavia, il valore esatto dipende dalla definizione esatta del tipo size_type. Purtroppo, questi valori massimi differiscono. Infatti, è (unsigned long)-1diverso da (unsigned short)-1 se la dimensione dei tipi è diversa. Quindi, il confronto

idx == std::string::npos

potrebbe restituire false se idx ha il valore -1e idx e string::nposhanno tipi diversi:

std::string s;
...
int idx = s.find("not found"); // assume it returns npos
if (idx == std::string::npos) { // ERROR: comparison might not work
...
}

Un modo per evitare questo errore è controllare se la ricerca fallisce direttamente:

if (s.find("hi") == std::string::npos) {
...
}

Tuttavia, spesso è necessario l'indice della posizione del carattere corrispondente. Quindi, un'altra semplice soluzione è definire il proprio valore con segno per npos:

const int NPOS = -1;

Ora il confronto sembra un po 'diverso e ancora più conveniente:

if (idx == NPOS) { // works almost always
...
}

3

foundsarà nposin caso di errore nel trovare la sottostringa nella stringa di ricerca.


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

Viene restituito da funzioni stringa che indicano errore / non trovato ecc.


0

npos è solo un valore di token che ti dice che find () non ha trovato nulla (probabilmente -1 o qualcosa del genere). find () verifica la prima occorrenza del parametro e restituisce l'indice in corrispondenza del quale inizia il parametro. Per esempio,

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

Questo codice non funzionerà per "asad.other" perché find () non restituisce un int.
LogicMagic

0

const statico size_t npos = -1;

Valore massimo per size_t

npos è un valore costante del membro statico con il valore massimo possibile per un elemento di tipo size_t.

Questo valore, se utilizzato come valore per un parametro len (o sublen) nelle funzioni membro della stringa, significa "fino alla fine della stringa".

Come valore di ritorno, viene solitamente utilizzato per indicare nessuna corrispondenza.

Questa costante è definita con un valore di -1, che poiché size_t è un tipo integrale senza segno, è il valore rappresentabile più grande possibile per questo tipo.


0

Una risposta per questi giorni di C ++ 17, quando abbiamo std::optional:

Se strizzi un po 'gli occhi e fingi di std::string::find()restituire un std::optional<std::string::size_type>(cosa che in qualche modo dovrebbe ...), la condizione diventa:

auto position = str.find(str2);

if ( position.has_value() ) {
    std::cout << "first 'needle' found at: " << found.value() << std::endl;
}

0

Il valore di string :: npos è 18446744073709551615. È un valore restituito se non viene trovata alcuna stringa.


Il valore effettivo è definito dall'attuazione e irrilevante. In pratica, tuttavia, il valore 18446744073709551615sarebbe tipico per 64 bit std::size_t, è un valore massimo senza segno a 64 bit.
Alex Guteniev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.